Как реализовать INotifyPropertyChanged без дублирования кода во всех классах, которые в нем нуждаются (и ни в каких других)? - PullRequest
1 голос
/ 16 июня 2020

Я бы хотел избежать дублирования кода. Из-за единственного наследования 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.

Но я получаю эти ошибки, когда пытаюсь сделать это: enter image description here

Как исправить эту ошибку?

Помогите, пожалуйста, реализовать INotifyPropertyChanged без дублирование кода реализации. Может, есть какой-то волшебный способ с атрибутами или что-то в этом роде? Например:

[Implements:INotifyPropertyChanged, ImplementNotifyPropertyChanged.cs]
class BaseViewModel {

}

Где Implements:INotifyPropertyChanged будет индикатором того, какой интерфейс реализует этот класс, а ImplementNotifyPropertyChanged.cs будет именем файла, в котором он может найти элементы, с помощью которых можно его реализовать.

...