C# - 之后实施 属性 观察

C# - Implement property observation afterwards

我有一个关于对象属性观察的问题。

例如,我有一个这样的class:

public class MyProperties
{
  public string Prop1 { get; set; }
  public int Prop2 { get; set; } 
}

我希望在 MyProperties 的属性之一发生更改时收到通知。我的愿景是这样的:

//I have an instance
MyProperties Prop = new Myproperties();
//And add a listener to the properties
Prop.Prop1.AddNotification(APropertyChanged);
Prop.Prop2.AddNotification(APropertyChanged);

//I have a eventhandler in my code
public void (object Sender, EventArgs e)
{
  //Sender is the Property
}

我不想更改 MyProperties 中的任何代码。有什么办法可以达到这样的效果.. 或者这个想法完全是愚蠢的?

如果您的 class MyProperties 实现了 INotifyPropertyChanged 接口,您可以引发 PropertyChanged 事件。否则你将不得不看一些框架(我想面向方面的编程框架可以提供帮助)。

您需要实施 INotifyPropertyChanged

看看 https://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

如果你愿意,你可以实现 INotifyPropertyChanged,

WPF MVVM中常用。

(你可以自己写一个事件处理器)

无论如何..我会做这样的事情:

private string _prop1;
private int _prop2;

public string Prop1
{
    get
    {
        return _prop1;
    }
    set
    {
        _prop1 = value;
        RiseEvent(nameof(Prop1),Prop1);
    }
}

public int Prop2
{
    get
    {
        return _prop2;
    }
    set
    {
        _prop2 = value;
        RiseEvent(nameof(Prop2),Prop2);
    }
}

protected void RiseEvent(string propertyName, object propertyValue)
{
    //---Code that uses the propertyName and propertyValue and rises an event as your choice
}

nameof() 是 C# 6 中的新语法(VS2015 支持) 如果您使用的是旧版本,您可以通过其他方式做到这一点(评论我,我会分享)

这是我的解决方案。感谢@romain-aga 的提示。

Fody PropertyChanged 允许在编译期间更改属性代码。如果我有 class:

public class MyProperties
{
    public string Prop1 { get; set; }
    ...
}

Fody 会编译这段代码:

public class MyProperties
{
    string prop1;
    public string Prop1
    {
        get { return prop1; }
        set
        {
            if (value != prop1)
            {
                prop1 = value;
                OnPropertyChanged("Prop1");
            }
        }
    }
    ...
}

通过反射,可以将方法添加到生成的 PropertyChanged 事件中:

EventInfo Event = typeof(MyProperties).GetEvent("PropertyChanged");
MethodInfo Method = //The methode of the handler you want
Delegate Handler = Delegate.CreateDelegate(Event.EventHandlerType, this, Method);
Event.AddEventHandler(IntanceOfMyProperties, Handler);