C#WPF如何动态设置Property setter方法?

我一直在寻找,但我似乎无法找到我正在寻找的东西,所以我会在这里试一试.

情况:
我有类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");
    }
}

感谢您的任何帮助!非常感谢:)

问候

解决方法:

您正在寻找的内容已经在面向方面编程(AOP)的概念中得到了解决.

一个例子是in PostSharp,(另外,see details here),它允许你编写你的数据/ viewmodel类,如下所示:

[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; }
}
上一篇:java – 哪种更好的做法,在类中使用私有变量或公共方法?


下一篇:合理利用Java不可变对象,让你的代码更加优雅