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

时间:2013-01-25 02:50:44

标签: c# mvvm inotifypropertychanged

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");
         }
      }
   }
}

由于

2 个答案:

答案 0 :(得分:3)

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

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

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

Plus Fody是免费开源的。

答案 1 :(得分:2)

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

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