自动生成可编译的 C# - 实现 INotifyPropertyChanged 的包装类

本文关键字:实现 INotifyPropertyChanged 包装类 编译 自动生成 | 更新日期: 2023-09-27 17:56:01

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# - 实现 INotifyPropertyChanged 的包装类

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

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

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

另外,Fody是免费的开源。

可以使用在

编译后修改 IL 的应用程序(如 PostSharp)或在运行时使用依赖关系注入来实现此效果(请参阅 INotifyPropertyChanged 的最佳实现)。 前者实际上生成 IL(但不是免费的),后者不会更改您的 IL 或生成任何内容,而是拦截您的事件设置器并为您引发 PropertyChanged 事件。

顺便说一句,如果您正在执行 WPF MVVM,则应检查 INPC 与依赖项属性的性能。 我已经看到时间表明后者要快得多。