【问题标题】:Autogenerating compilable C# - wrapper class implementing INotifyPropertyChanged [closed]自动生成可编译的 C# - 实现 INotifyPropertyChanged 的​​包装类
【发布时间】:2013-01-25 02:50:44
【问题描述】:

MVVM 涉及大量编写样板代码,如多篇文章所述。很多快捷方式似乎都提供运行时评估,但我想知道是否有一个免费实用程序使用反射来生成 c# 代码,即:

Class A
{
   int I {get;set;}
   ICollection C {get; set;}
}

会给我一个包含类似内容的文件或剪贴板

Class ViewModelA : INotifyPropertyChanged
{
   readonly A _a;
   private ObservableCollection _c;
   ViewModelA(ClassA a)
   {
      _a=a;
      _c=new ObservableCollection(a.C);
   }
   int I
   {
      get {return _a.I;}
      set
      {
         (if _a.I != value)
         {
           _a.I = value;
           NotifyPropertyChanged("I");
         }
      }
   }
}

谢谢

【问题讨论】:

    标签: c# mvvm inotifypropertychanged


    【解决方案1】:

    PropertyChanged.Fody 是我用来处理这个问题的。

    它已经识别出大多数 MVVM 框架的基类,并调用适当的方法来进行通知。否则它会找到任何实现 INPC 的类并为你转换它。

    我更喜欢 Fody 而不是 PostSharp 的原因是 Fody 将 IL 添加到您的程序集中,然后自行清理,因此您不依赖 Fody 或任何其他程序集,并且您的代码是自包含的。 PostSharp 只是添加拦截器,然后调用 PostSharp 库,然后返回到您添加的任何拦截器。这在运行时速度较慢,您需要依赖 PostSharp 库。

    Plus Fody 是免费和开源的。

    【讨论】:

      【解决方案2】:

      您可以使用在编译后修改 IL 的应用程序(例如 PostSharp)或在运行时使用依赖注入(请参阅 The Best Implementation of INotifyPropertyChanged Ever)来实现此效果。前者实际生成 IL(但不是免费的),后者不会更改您的 IL 或生成任何东西,而是拦截您的事件设置器并为您引发 PropertyChanged 事件。

      顺便说一句,如果您正在使用 WPF MVVM,您应该检查 INPC 与 Dependency Properties 的性能。我看到的时间表明后者要快得多。

      【讨论】:

      • +1 用于 PostSharp。 “NotifyPropertyChanged”问题是文档中的典型示例。
      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 2013-02-17
      • 2012-12-17
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2016-11-19
      相关资源
      最近更新 更多