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);
我有一个关于对象属性观察的问题。
例如,我有一个这样的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);