【问题标题】:C# WPF How to set Property setter method dynamically?C# WPF 如何动态设置属性设置方法?
【发布时间】:2011-09-18 12:06:40
【问题描述】:

我一直在四处寻找,但似乎找不到我要找的东西,所以我会在这里试一试。

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

感谢您的帮助!将不胜感激:)

问候

【问题讨论】:

  • +1 有趣的问题,很高兴看到这个结果。

标签: c# dynamic methods properties setter


【解决方案1】:

您正在寻找的东西已经在面向方面编程 (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; }

我发现其中一个不错的功能是可以声明属性之间的依赖关系。在这种情况下,RaisePropertyChanged("FoobarTimesTwo") 将在 FooBar 更改时被调用。

[DependsOn("FooBar")]
public int FoobarTimesTwo
{
    get { return FooBar * 2; }
}

【讨论】:

  • +1 件有趣的作品。如果您想自己编写代码,详细信息的链接提供了编码思路。
  • 感谢您的快速回复,这正是我所需要的。遗憾的是它不是免费使用的,但也许我可以弄清楚或找到其他一些 AOP 框架。
【解决方案2】:

除了像 PostSharp 这样的 AOP 框架之外,还有这样的东西:

Mono.Cecil

使用该工具,您可以获取程序集,修改其代码并将其保存回来

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

LinFu Articles on CodeProject

【讨论】:

    【解决方案3】:

    开源框架ImpromptuInterface.MVVM 使用 C# 4.0 动态特性添加支持属性更改的自动属性。它的 ImpromptuViewModel 像 ExpandoObject 一样工作,但还有其他功能可以帮助 MVVM。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-25
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2015-10-19
      • 2016-03-13
      相关资源
      最近更新 更多