2012-02-02 173 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項目?我正在以正確的方式來解決這個問題嗎?

謝謝你,比爾ñ

回答

2

NestedProperyExample方法拼錯了一點,但不介意 - 這不是問題(:其實,這個問題可能是,那NestedProperyExample方法調用TypeDescriptor.GetProperties(Object)過載,傳遞。一些字符串("Form1." + nestedProperties[0])按照文檔(MSDN),它的作用很像剛剛TypeDescriptor.GetProperties(typeof(string))string的只拿到了一個簡單的屬性,其Length, - 這就是爲什麼TypeDescriptor.GetProperties不返回任何更多PropertyDescriptor項目

此。回答你的直接問題,但你的英寸對我來說,提示是不清楚的。如果你可以重新解釋你的問題,並明確你想要用這些代碼完成什麼,那麼你可能會得到一個更好的答案。