自动生成可编译的 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");
}
}
}
}
谢谢
PropertyChanged.Fody 是我用来处理这个问题的。
它已经识别了来自大多数 MVVM 框架的基类,并调用了适当的方法来执行通知。否则,它会找到任何实现 INPC 的类并为您转换它。
我更喜欢 Fody 而不是 PostSharp 的原因是 Fody 将 IL 添加到你的程序集中,然后清理自己,所以你不依赖于 Fody 或任何其他程序集,并且你的代码是独立的。PostSharp只是添加拦截器,然后调用PostSharp库,然后回到您添加的任何拦截器。这在运行时速度较慢,您需要依赖PostSharp库。
另外,Fody是免费的开源。
可以使用在
编译后修改 IL 的应用程序(如 PostSharp)或在运行时使用依赖关系注入来实现此效果(请参阅 INotifyPropertyChanged 的最佳实现)。 前者实际上生成 IL(但不是免费的),后者不会更改您的 IL 或生成任何内容,而是拦截您的事件设置器并为您引发 PropertyChanged 事件。
顺便说一句,如果您正在执行 WPF MVVM,则应检查 INPC 与依赖项属性的性能。 我已经看到时间表明后者要快得多。