Я бы хотел избежать дублирования кода. Из-за единственного наследования 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. просто чтобы назвать несколько.
Итак, я попытался сделать это:
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 {
}
И не совсем необходимо реализовать INotifyPropertyChanged
члены в BaseViewModel
, потому что реализация по умолчанию уже находится в IImplementNotifyPropertyChanged.
. А затем сделайте то же самое во всех других классах: я бы просто добавил IImplementNotifyPropertyChanged
, и это было бы концом INotifyPropertyChanged
во всех классах, которые действительно в нем нуждаются, без дублирования кода и загрязнения решения путем получения всех моих классов из класса BaseNotifyPropertyChanged.
Но я получаю эти ошибки, когда пытаюсь сделать это:
Как исправить эту ошибку?
Помогите, пожалуйста, реализовать INotifyPropertyChanged
без дублирование кода реализации. Может, есть какой-то волшебный способ с атрибутами или что-то в этом роде? Например:
[Implements:INotifyPropertyChanged, ImplementNotifyPropertyChanged.cs]
class BaseViewModel {
}
Где Implements:INotifyPropertyChanged
будет индикатором того, какой интерфейс реализует этот класс, а ImplementNotifyPropertyChanged.cs
будет именем файла, в котором он может найти элементы, с помощью которых можно его реализовать.