2012-02-02 1 views
1

У меня есть следующий код:Получение 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 элементов? Правильно ли я это делаю?

Спасибо, Билл N

ответ

2

Метод NestedProperyExample Ошибочное немного, но не возражает - это не проблема (: На самом деле, эта проблема может быть, что NestedProperyExample метод вызывает перегрузку TypeDescriptor.GetProperties(Object), передавая его . некоторая строка ("Form1." + nestedProperties[0]) согласно документации (MSDN), он действует очень похоже просто TypeDescriptor.GetProperties(typeof(string))string «s получил только одно простое свойство, его Length, -., и поэтому TypeDescriptor.GetProperties не возвращает больше PropertyDescriptor пунктов

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