C # - Рекурсивные / Отражающие Значения Свойств - PullRequest
12 голосов
/ 22 апреля 2010

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

string propPath = "ShippingInfo.Address.Street";

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

this.ShippingInfo.Address.Street 

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

Ответы [ 2 ]

25 голосов
/ 22 апреля 2010

Может, как-то так?

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);
1 голос
/ 22 апреля 2010

Похоже на набор вызовов вложенных свойств:

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

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

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

и так далее.Вы получаете картину.

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

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

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

...