С# - Значения свойств рекурсивного/отражения

Каков наилучший способ сделать это на С#?

string propPath = "ShippingInfo.Address.Street";

У меня будет путь к свойствам, подобный приведенному выше, из файла сопоставления. Мне нужно иметь возможность спросить объект Order, каково будет значение кода ниже.

this.ShippingInfo.Address.Street 

Балансирующая производительность с элегантностью. Все отношения между объектными графами должны быть взаимно однозначными. Часть 2: насколько сложно было бы добавить возможности для захвата первого, если это List < > или что-то вроде этого.

Ответ 1

Возможно, что-то вроде этого?

string propPath = "ShippingInfo.Address.Street";

object propValue = this;
foreach (string propName in propPath.Split('.'))
{
    PropertyInfo propInfo = propValue.GetType().GetProperty(propName);
    propValue = propInfo.GetValue(propValue, null);
}

Console.WriteLine("The value of " + propPath + " is: " + propValue);

Или, если вы предпочитаете LINQ, вы можете попробовать это вместо этого. (Хотя я лично предпочитаю версию, отличную от LINQ.)

string propPath = "ShippingInfo.Address.Street";

object propValue = propPath.Split('.').Aggregate(
    (object)this,
    (value, name) => value.GetType().GetProperty(name).GetValue(value, null));

Console.WriteLine("The value of " + propPath + " is: " + propValue);

Ответ 2

Звучит как набор вложенных свойств:

класс X имеет свойство, называемое ShippingInfo; тип, представленный ShippingInfo, имеет адрес свойства; тип, представленный Address, имеет свойство, называемое Street.

Итак, предположим, что вы знаете подходящий экземпляр класса X для работы:

  • tokenize string через string.Split( ".". ToCharArray()) в строку [] или что-то вроде этого
  • начните с известного экземпляра X
  • использовать отражение для получения MethodInfo для getInfo для доставки.
  • использовать отражение, чтобы получить возвращаемый тип ShippingInfo get()
  • Вызов геттера с использованием отражения
  • используя возвращаемое значение из ShippingInfo get() и Тип возврата:
    • получить MethodInfo для getter-адреса в возвращаемом типе.....

и т.д. Вы получаете изображение.

Кажется, немного длинный и утомительный, и это так. Но так вы могли бы сделать это через отражение.

Интересно, можно ли сделать то же самое с LINQ to Objects?

Ответ на часть 2 включает в себя получение начального значения X из списка List < > .