我对观察物体属性有疑问。
例如,我有一个这样的类:
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 中的任何代码。有没有办法实现这样的事情......还是这个想法完全是愚蠢的?
答案 0 :(得分:1)
如果您的类MyProperties实现了INotifyPropertyChanged接口,则可以引发PropertyChanged事件。否则你将不得不看一些框架(我猜面向方面的编程框架可以帮助)。
答案 1 :(得分:0)
您需要实施INotifyPropertyChanged
看看 https://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx
答案 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);