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

时间:2011-06-20 08:17:13

标签: c# dynamic methods properties 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");
    }
}

感谢您的帮助!我们将非常感激:)

问候

3 个答案:

答案 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框架之外,还有以下内容:

Mono.Cecil

使用该工具,您可以进行装配,修改代码并将其保存回来

LinFu的一些关于AOP的文章可能有所帮助

LinFu Articles on CodeProject

答案 2 :(得分:0)

开源框架ImpromptuInterface.MVVM使用C#4.0动态功能添加支持属性更改的自动属性。它的ImpromptuViewModel就像一个ExpandoObject,但也有其他功能来帮助MVVM。