Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何实现INotifyPropertyChanged而不在所有需要它的类(而不是任何其他类)中复制代码?_C#_C# 8.0 - Fatal编程技术网

C# 如何实现INotifyPropertyChanged而不在所有需要它的类(而不是任何其他类)中复制代码?

C# 如何实现INotifyPropertyChanged而不在所有需要它的类(而不是任何其他类)中复制代码?,c#,c#-8.0,C#,C# 8.0,我希望避免代码重复。由于C#的单一继承,我不能只创建BaseNotifyPropertyChanged类: class BaseNotifyPropertyChanged : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual voi

我希望避免代码重复。由于C#的单一继承,我不能只创建BaseNotifyPropertyChanged类:

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。