Существующие ответы в порядке; просто альтернативная перспектива: во многих сценариях желательно использовать System.ComponentModel, а не прямое отражение, поскольку это позволяет использовать сценарии свойств времени выполнения, то есть как DataView DataView предоставляет столбцы как свойства.
Производительность - по умолчанию это в значительной степени идентично, но если вы делаете много этого (например, импорт/экспорт объемных данных), вы можете добиться значительного увеличения производительности с помощью этого подхода, любезно предоставленного HyperDescriptor.
Чтобы использовать System.ComponentModel, код похож, но немного отличается:
static void Main()
{
object obj = new Customer { Address = new Address { ZipCode = "abcdef" } };
object address = GetValue(obj, "Address");
object zip = GetValue(address, "ZipCode");
Console.WriteLine(zip);
}
static object GetValue(object component, string propertyName)
{
return TypeDescriptor.GetProperties(component)[propertyName].GetValue(component);
}
Это тогда дает ту же обработку, как если бы вы использовали привязки данных для привязки к «Address.ZipCode» (сглаживание некоторых деталей, таких как списки и т. д.).
(обратите внимание, что вы можете бросить молнию в виде строки и т.д., если вы знаете, что ожидаемый тип)
Чтобы получить значение из глубокого пути (в том числе и тот же список обработки, который использует привязки данных), вы бы использовать что-то вроде:
static object ResolveValue(object component, string path) {
foreach(string segment in path.Split('.')) {
if (component == null) return null;
if(component is IListSource) {
component = ((IListSource)component).GetList();
}
if (component is IList) {
component = ((IList)component)[0];
}
component = GetValue(component, segment);
}
return component;
}
списка вещь примерно отражает поведение регулярного связывание данных (хотя он не включает несколько вещей, как обязательные контексты, валютные-менеджеры и т.д.)
Хороший ответ! ... Суперподобный. – Hrishi 2014-04-23 10:39:19