修改成员时不调用 C# 对象设置器 [英] C# Object Setter Not Called When Member is Modified
问题描述
我有以下包装类:
public class Wrapper
{
public int Member;
}
在一个单独的类中,我有以下内容:
In a separate class, I have the following:
public class ContainerClass
{
private Wrapper data;
public Wrapper Property
{
get { return data; }
set { data = value; }
}
public void Foo()
{
Property.Member = 42;
}
}
当 Property.Member
在 Foo()
中被修改时,什么都不会发生(setter 被跳过).但是,我仍然可以执行以下操作,例如:
When Property.Member
is modified in Foo()
, nothing happens (the setter is skipped). However, I can still do the following, for example:
public void Foo()
{
Property = Property;
}
并输入所需的设置器.所以我的问题是,为什么不修改对象属性的成员调用该属性的 setter?
and enter the desired setter. So my question is, why doesn't modifying the member of an object property call that property's setter?
推荐答案
因为您没有设置 Property
的值.您的代码只是调用 Property
的 getter,然后设置 Member
字段的值(如果它是一个属性,这里不是这种情况).
Because you aren't setting the value of Property
. Your code just invokes the getter of Property
, then setting the value of the Member
field (which would invoke the setter of Member
if it were a property, which isn't the case here).
如果要在设置Member
时执行代码,需要有
If you want to execute code when Member
is set, you need to have
public class Wrapper
{
private int member;
public int Member
{
get { return this.member; }
set
{
this.member = value;
DoSomething();
}
}
}
<小时>
或者更优雅的解决方案是使用事件.内置的 INotifyProperyChanged 界面为您提供了一个非常好的模板东西.
Or perhaps a more elegant solution would be to use events. The built-in INotifyProperyChanged interface gives you a pretty good template for this sort of thing.
using System.ComponentModel;
public class Wrapper : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int member;
public int Member
{
get { return this.member; }
set
{
this.member = value;
this.OnPropertyChanged("Member");
}
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
public class ContainerClass
{
private Wrapper data;
public Wrapper Property
{
get { return data; }
set { data = value; }
}
public void Foo()
{
data.PropertyChanged += data_PropertyChanged;
Property.Member = 42;
}
private void data_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Member")
{
DoStuff();
}
}
}
这篇关于修改成员时不调用 C# 对象设置器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!