Как упростить получение и набор глубоких свойств

#c#

#c#

Вопрос:

Кто-нибудь знает, как переписать это, чтобы избежать повторения myData.wwwww.xxxxx.yyyyy.zzzzz?

 public string DeepString{
get => myData.wwwww.xxxxx.yyyyy.zzzzz; 
set
{
   if(myData.wwwww.xxxxx.yyyyy.zzzzz != value)
   {
     myData.wwwww.xxxxx.yyyyy.zzzzz = value;
     OnPropertyChanged();
   }
}

public event PropertyChangedEventHandler? PropertyChanged; // = delegate { };
protected virtual void OnPropertyChanged([CallerMemberName] string s = null)
{
   if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(s));
}
 

Комментарии:

1. Ссылаться на последний объект? Или сделать его свойством

2. Милни ответил на ваш точный вопрос, но в целом кажется, что границы ответственности неясны, и у вас может возникнуть проблема с дизайном OO в целом. По сути, для меня это запах кода. У меня нет подходящего дизайна, чтобы предложить, нам, вероятно, нужно больше информации о том, чего вам нужно достичь для этого.

3. @Pac0 объектно-ориентированные спагетти-ОО

4. Вероятно, это результат работы с XML в какой-то момент жизненного цикла.

5. Вы можете сохранить закрытую переменную, ссылающуюся на myData.wwwww.xxxxx.гггг и просто перейти _privateVar.zzzzz вместо этого

Ответ №1:

Вероятно, это примерно так же хорошо, как вы собираетесь получить…

Вы могли бы определить делегат / действие для получения / установки значения и вызвать его — но IMO это слишком сильно изменило бы фактическое поведение и выглядело бы странно…

 private String _shorterName => myData.wwwww.xxxxx.yyyyy;

public string DeepString{
get => _shorterName.zzzzz; 
set
{
   if (_shorterName.zzzzz != value)
   {
     _shorterName.zzzzz = value;
     OnPropertyChanged();
   }
}
 

Или добавьте свойство к объекту myData, которое => wwwww.xxxxx.гггг; Затем ссылайтесь на myData.NewProperty — но тогда ваш вид просто пинает банку по дороге, как это было.

Комментарии:

1. Вероятно, стоит отметить, что если что-то из этого равно нулю, будут драконы

2. Да, действительно. Однако это тоже проблема с оригиналом. ОП — Ты можешь это сделать ? .wwww?.xxxx?.гггг, если вы хотите, чтобы значение NULL распространялось до самого верха, а не вызывало исключение Null

3. _shorterName не возвращает строку, возвращает экземпляр класса со свойством string zzzzz

4. Да, хорошо, тогда просто измените Строку на имя этого класса… Ты никогда не говорил нам, какой это был класс, так что я не могу читать твои мысли