С# - Значения свойств рекурсивного/отражения
Каков наилучший способ сделать это на С#?
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 < > .