我一直在寻找,但我似乎无法找到我正在寻找的东西,所以我会在这里试一试。
情况: 我有类MainWindow和MainWindowData。在MainWindowData中,只有使用属性UpdateGUI定义的公共属性。
public class UpdateGUI : Attribute { }
public class MainWindowData
{
[UpdateGUI]
public string TESTVAR { get; set; }
}
现在我想在MainWindowData中为每个属性的setter方法添加一个方法。更具体:
void OnPropertyChanged(String PropertyName);
我想我会在MainWindow构造函数中获取所有UpdateGUI属性,然后以某种方式添加另一个方法,但这就是我被困住的地方。 我使用此代码来获取所有属性,这些属性有效:
List<PropertyInfo> properties = (from pi in typeof(MainWindowData).GetProperties()
where pi.GetCustomAttributes(typeof(UpdateGUI), false).Any()
select pi).ToList();
这给了我一个很好的列表,列出了我必须更新的所有属性。
所以问题是:如何才能使属性动态转换为:
[UpdateGUI]
public string TESTVAR { get; set; }
为:
[UpdateGUI]
private string _TESTVAR;
public string TESTVAR {
get {
return _TESTVAR;
}
set {
_TESTVAR = value;
OnPropertyChanged("TESTVAR");
}
}
感谢您的帮助!我们将非常感激:)
问候
答案 0 :(得分:5)
您正在寻找的内容已经在面向方面编程(AOP)的概念中得到了解决。
一个例子是in PostSharp,(另外,see details here),它允许你编写像这样的数据/视图模型类:
[NotifyPropertyChanged]
public class Shape
{
public double X { get; set; }
public double Y { get; set; }
}
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
}
如果您不喜欢PostSharp,我确信其他AOP框架具有类似的功能。
修改强>
我刚刚找到了NotifyPropertyWeaver,无需完整的AOP框架即可为您完成此任务。
它使用Mono.Cecil的东西在编译期间注入通知代码,并且可以通过NuGet(这是我做的)或从项目网站安装。
默认情况下,它甚至不需要属性(它会自动确定哪些属性和类需要更改通知),但您也可以是明确的,如下所示:
[NotifyProperty]
public int FooBar { get; set; }
我发现其中一个很好的功能是可以声明属性之间的依赖关系。在这种情况下,只要FooBar发生变化,就会调用RaisePropertyChanged("FoobarTimesTwo")
。
[DependsOn("FooBar")]
public int FoobarTimesTwo
{
get { return FooBar * 2; }
}
答案 1 :(得分:1)
除了像PostSharp这样的AOP框架之外,还有以下内容:
使用该工具,您可以进行装配,修改代码并将其保存回来
LinFu的一些关于AOP的文章可能有所帮助
答案 2 :(得分:0)
开源框架ImpromptuInterface.MVVM使用C#4.0动态功能添加支持属性更改的自动属性。它的ImpromptuViewModel就像一个ExpandoObject,但也有其他功能来帮助MVVM。