我想拥有一个可以获得/设置的公共财产。但我也希望在设置时触发NameChanged事件,但我不希望有一个非公共字段来存储它的值。
我的问题是,在setter中,如何在不引起无限递归的情况下为属性分配新值?
public delegate void NameChangedHandler( object sender, EventArgs e );
event NameChangedHandler NameChanged;
public String Name
{
get;
set { Name = value; NameChanged(this, null); } // Recursion ?
}
答案 0 :(得分:4)
[...]但我不希望有一个非公共字段来存储它的值。
无法满足此要求。即使自动属性也有private
字段支持其值。它们仍然在C#编译期间创建。而且,awyay,您无法在 getter 或 setter 中将自动属性和属性与body混合。
也许你可能会对我在几个月前创建并发布的一个名为TrackerDog的开源项目感兴趣,它可以将任何对象转换为可更改的对象。 INotifyPropertyChanged
在运行时使用代理自动实现。
这样,您就不需要切换到非自动属性,仍然可以注入事件,并且给定对象中的每个 set 属性都会提升{{1事件。
例如,给定以下类:
INotifyPropertyChanged.PropertyChanged
...您可以将public class User
{
public virtual string Name { get; set; }
public virtual byte Age { get; set; }
}
的实例转换为可更改跟踪,如下所示:
User
...现在User user = new User().AsTrackable();
// or
User user = Trackable.Of<User>();
实例实现了User
:
INotifyPropertyChanged
检查项目的完整how-to to get further details。
答案 1 :(得分:0)
如果你想让你的Setter实际上没有设置任何东西,你可以这样做。 (不知道你为什么要这样,但是,没有什么能阻止你。)
public String Name
{
get { return _Name; }
set { NameChanged(this, null); }
}
这是有效的,并且编译得很好。
value
只不过是你的setter方法的一个参数,就像任何其他方法一样,你可以选择对你的参数做任何事情。