Какое зло из двух меньшее? - C#

Узнай цену своей работы

Формулировка задачи:

Меня всегда раздражал практически идентичный код в некоторых местах кода. Но порой проще смирится с этим, ведь решение обойдется дороже , возможно, в плане производительности, и количестве работы. Такая вот дрянь и в паттерне MVVM. Если есть любая не OneTime или OneWayToSource привязка, то должен быть реализован интерфейс INotify... даже и писать полное имя не хочется. В каждом прибиндиваемом свойстве обязательно будет однотипный код, вроде проверки не было ли это значение, что и до, обязательный вызов события с поверкой на null, в лучше случае для этой однотипной работы будет создан абстрактный класс с объявленными событиями и методом OnPropertyChanged. Решить эту проблему трудно. Можно сделать с помощью рефлексии, но медленно, да и прописывать все время в придачу к свойству nameof тоже утомляет. Можно последовать способу обертывания, что я и решил попробовать сделать. Обертка :
    public abstract class TypeShell : PropertyChangedNotifer, INotifyPropertyChanging
    {
        public event PropertyChangingEventHandler PropertyChanging;
        protected object IncapsulatePropertyValue;
 
        protected TypeShell(object incapsulatePropertyValue) => IncapsulatePropertyValue = incapsulatePropertyValue;
 
        protected void OnPropertyChanging(string propertyName)
            => PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName));
    }
 
    public class TypeShell : TypeShell
    {
        public T Value
        {
            get => (T) IncapsulatePropertyValue;
            set
            {
                if (Equals(value, IncapsulatePropertyValue))
                    return;
                OnPropertyChanging(nameof(Value));
                IncapsulatePropertyValue =  value;
                OnPropertyChanged(nameof(Value));
            }
        }
 
        private TypeShell(T value) : base(value)
        {
            
        }

        public static implicit operator TypeShell(T value) => new TypeShell(value);
        public static implicit operator T(TypeShell value) => (T) value.IncapsulatePropertyValue;
    }
Допустим, примитивная viewmodel:
    public class SmartViewModel
    {
        public TypeShell Name { get; } = "My name is fiddooor";
 
        public SmartViewModel()
        {
            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(3000);
                Name.Value = "!";
            });
        }
    }
Но все равно нужно будет все время писать Property.Value!!! Хоть застрелись опять повторяющийся код. Можно еще написать расширение разметки, чтобы в xaml не писать все время.Value Вот и как это разрешить, и что лучше

Решение задачи: «Какое зло из двух меньшее?»

textual
Листинг программы
    public abstract class NotifyPropertyChangedViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void NotifyPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
 
        protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
        {
            if (!EqualityComparer<T>.Default.Equals(field, value))
            {
                field = value;
                NotifyPropertyChanged(propertyName);
            }
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5
Похожие ответы