C#'set'只会引发一个事件

时间:2016-04-26 18:38:27

标签: c# events recursion properties setter

我想拥有一个可以获得/设置的公共财产。但我也希望在设置时触发NameChanged事件,但我不希望有一个非公共字段来存储它的值。

我的问题是,在setter中,如何在不引起无限递归的情况下为属性分配新值?

public delegate void NameChangedHandler( object sender, EventArgs e );

event NameChangedHandler NameChanged;

public String Name
{
    get;
    set { Name = value; NameChanged(this, null); } // Recursion ?
}

2 个答案:

答案 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方法的一个参数,就像任何其他方法一样,你可以选择对你的参数做任何事情。