C# - 之后实施属性观察

时间:2016-05-22 17:19:24

标签: c# events notifications observer-pattern observers

我对观察物体属性有疑问。

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

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 中的任何代码。有没有办法实现这样的事情......还是这个想法完全是愚蠢的?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

答案 2 :(得分:0)

如果您愿意,可以实施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中受支持) 如果你使用的是旧版本,你可以用其他方式做到这一点(评论我和我将分享它)

答案 3 :(得分:0)

这是我的解决方案。感谢@ romain-aga的小费。

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

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);