C# 如何实现INotifyPropertyChanged而不在所有需要它的类(而不是任何其他类)中复制代码?
我希望避免代码重复。由于C#的单一继承,我不能只创建BaseNotifyPropertyChanged类:C# 如何实现INotifyPropertyChanged而不在所有需要它的类(而不是任何其他类)中复制代码?,c#,c#-8.0,C#,C# 8.0,我希望避免代码重复。由于C#的单一继承,我不能只创建BaseNotifyPropertyChanged类: class BaseNotifyPropertyChanged : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual voi
class BaseNotifyPropertyChanged : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
因为一些需要实现INotifyPropertyChanged的类也需要从其他类继承。我不能把它作为我的基类,因为有些类继承自.NET类,这也会污染我的解决方案中的所有类,因为只有一些类实际需要INotifyPropertyChanged(而其他类则不需要它)。一个例子是DependencyObject。无法同时从BaseNotifyPropertyChanged类和DependencyObject继承
在我学习的所有书籍和课程中,人们只是在所有基类中重复INotifyPropertyChanged实现:BaseViewModel、BaseModel、BaseDataModel、BaseSynchronizableDataModel,仅举几个例子
所以我试着这样做:
interface IImplementNotifyPropertyChanged : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
class BaseViewModel : IImplementNotifyPropertyChanged {
}
为了能够做到这一点:
interface IImplementNotifyPropertyChanged : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
class BaseViewModel : IImplementNotifyPropertyChanged {
}
并且实际上不必在BaseViewModel
中实现INotifyPropertyChanged
成员,因为默认实现已经在IImplementNotifyPropertyChanged.
中,然后在所有其他类中执行相同的操作:我只需添加IImplementNotifyPropertyChanged
,这将是所有实际需要它的类中的INotifyPropertyChanged
实现的结束,通过从BaseNotifyPropertyChanged类派生我的所有类,不会复制代码和污染解决方案
但当我尝试这样做时,会出现以下错误:
如何修复此错误
请帮助我实现INotifyPropertyChanged
,而不复制实现代码。也许有一些神奇的属性或者什么?比如:
[Implements:INotifyPropertyChanged, ImplementNotifyPropertyChanged.cs]
class BaseViewModel {
}
其中
Implements:INotifyPropertyChanged
将是该类实现的接口的指示符,ImplementNotifyPropertyChanged.cs
将是文件名,在该文件中可以找到要实现它的成员。是否检查了fody?weaver在用fody回答你的问题吗?这些问题似乎是一个确切的答案duplicates@PavelAnikhouski它不是重复的,因为我的问题是关于INotifyPropertyChanged而不复制代码,而您链接为重复的问题是关于带有C#8默认接口实现/特征的事件继承。对我来说,消除INPC代码重复的解决方案是否使用多重继承、C#8接口DIM、属性参数、某种注入或任何其他方法都无关紧要,在问题中,您将其链接为副本,这是关于使用C#8默认接口实现/特征的事件继承。第一个副本正是关于在使用DIM@PavelAnikhouski您链接的第一个问题是关于使用C#8默认接口实现/特征的事件继承,第二个问题一个是关于错误的事件只能出现在+=或-=的左侧。我的问题既不是关于DIMs,也不是关于错误事件只能出现在+=或-=
的左侧。我的问题是如何在不重复代码的情况下实现INPC。这两个问题只回答了为什么我得到了错误事件只能出现在+=或-=
的左侧,以及为什么我们不能在不复制代码的情况下使用DIMs来实现INPC。您检查过fody吗?weaver在用fody回答你的问题吗?这些问题似乎是一个确切的答案duplicates@PavelAnikhouski它不是重复的,因为我的问题是关于INotifyPropertyChanged而不复制代码,而您链接为重复的问题是关于带有C#8默认接口实现/特征的事件继承。对我来说,消除INPC代码重复的解决方案是否使用多重继承、C#8接口DIM、属性参数、某种注入或任何其他方法都无关紧要,在问题中,您将其链接为副本,这是关于使用C#8默认接口实现/特征的事件继承。第一个副本正是关于在使用DIM@PavelAnikhouski您链接的第一个问题是关于使用C#8默认接口实现/特征的事件继承,第二个问题一个是关于错误的事件只能出现在+=或-=的左侧。我的问题既不是关于DIMs,也不是关于错误事件只能出现在+=或-=
的左侧。我的问题是如何在不重复代码的情况下实现INPC。这两个问题只回答了为什么我得到错误事件只能出现在+=或-=
的左侧,以及为什么我们不能在不复制代码的情况下使用DIMs来实现INPC。