Fody
Extensible tool for weaving .net assemblies, attempts to eliminate that plumbing code through an extensible add-in model. - Fody
Fody 可以在编译阶段修改 IL 代码,使用 Fody,我们可以不必在代码文件中编写大量的样板代码,Fody 会将样板代码在编译期插入到最终的代码文件中。
PropertyChanged
在使用 MVVM 模式中,通常我们会将 ViewModel 实现 INotifyPropertyChanged
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName]
string property = "")
{
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(property));
}
}
在每个 Property 中调用 OnPropertyChanged 方法
private string foo;
public string Foo
{
get { return foo; }
set
{
foo = value;
OnPropertyChanged();
}
}
每一个需要通知的属性,都需要定义成上面这样,不仅增加了键盘敲击次数,也增加了代码的阅读难度。我们也可以通过其它方式来消除样板代码,如 BindableProperty,但 Fody 会让代码的定义更加简洁直观。
使用 PropertyChanged.Fody 消除样板代码
PropertyChanged.Fody 会自动在编译期为实现了 INotifyPropertyChanged 类的属性插入 OnPropertyChanged() 的调用,比如像上面的属性定义可以定义成这样
public string Foo { get; set; }
使用 PropertyChanged.Fody 需要3步
- 使用 nuget 安装 PropertyChanged.Fody
- 配置 FodyWeavers.xml
- Release 下设置 Debug information
FodyWeavers.xml 配置用于控制代码生成的行为,通过
<Weavers>
<PropertyChanged EventInvokerNames="RaisePropertyChanged"/>
</Weavers>
以上配置,Fody 默认会为 Property Set 添加 RaisePropertyChanged() 方法调用。
由于 Fody 需要获取项目的调试文件,所以 Realse 模式下,依然需要设置保留调试符号,如 Symbols only,Fody 才能正常工作。
Fody PropertyChanged
Pdb full vs only
Debugging with Symbols