Получение PropertyDescriptor вложенного объекта
У меня есть следующий код:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
object o;
Person p = new Person { FirstName = "John", Surname = "Henry" };
Citizen c = new Citizen { Country = "Canada", ResidentName = p };
SportsFan sf = new SportsFan { Sport = "Hockey", Fan = c };
Discoverer<SportsFan>.SimpleExample("Sport", "Hockey",out o);
Discoverer<SportsFan>.NestedProperyExample("Fan.Citizen.FirstName", "John",out o);
}
private class Person
{
public string FirstName
{
get; set;
}
public string Surname
{
get; set;
}
}
private class Citizen
{
public Person ResidentName
{
get; set;
}
public string Country
{
get; set;
}
}
private class SportsFan
{
public string Sport
{
get; set;
}
public Citizen Fan
{
get; set;
}
}
private class Discoverer<T>
{
public static void SimpleExample(string propName, string objResultToString,out Object obj)
{
PropertyDescriptor propDesc;
propDesc = TypeDescriptor.GetProperties(typeof(T))[propName];
TypeConverter converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
obj = converter.ConvertFromString(objResultToString);
}
public static void NestedProperyExample(string propName, string objResultToString, out Object obj)
{
PropertyDescriptor propDesc = null;
obj = null;
string[] nestedProperties = propName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
propDesc = TypeDescriptor.GetProperties("Form1." + nestedProperties[0])[nestedProperties[1]];
for (int i = 1; i < nestedProperties.Length - 1; i++)
{
if (propDesc != null)
propDesc = TypeDescriptor.GetProperties(propDesc.GetType())[nestedProperties[i + 1]];
}
if (propDesc != null)
{
TypeConverter converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
obj = converter.ConvertFromString(objResultToString);
}
}
}
}
Код работает для simpleExample
, На NestedPropertyExample
, первое назначение PropDesc
возвращается null
, Когда я проверяю TypeDescriptor.GetProperties("Form1." + nestedProperties[0])
, он возвращает PropertyDescriptorCollection
одного предмета, и это длина.
Почему я не вернусь больше PropertyDesriptor
Предметы? Я иду об этом правильным путем?
Спасибо, Билл Н
1 ответ
NestedProperyExample
метод написан с ошибкой, но не возражайте - это не проблема ((На самом деле проблема может быть в том, что NestedProperyExample
метод вызывает TypeDescriptor.GetProperties(Object)
перегрузка, передавая некоторую строку ("Form1." + nestedProperties[0])
, Согласно документам ( MSDN), он действует очень похоже на просто TypeDescriptor.GetProperties(typeof(string))
, string
есть только одно простое свойство, его Length
, -- И вот почему TypeDescriptor.GetProperties
больше не возвращается PropertyDescriptor
Предметы.
Это отвечает на ваш прямой вопрос, но ваши намерения мне неясны. Может быть, если бы вы могли перефразировать свой вопрос и четко заявить, чего вы пытаетесь достичь с помощью этого кода, вы, вероятно, получите лучший ответ.