2011-02-02 25 views
11

如何使用c#中的反射讀取包含數組類型元素的對象的屬性。如果我有一個名爲GetMyProperties的方法,並且我確定該對象是一個自定義類型,那麼我該如何讀取一個數組的屬性和其中的值。 IsCustomType是確定類型是否爲自定義類型的方法。使用包含另一個對象數組的對象的反射讀取屬性

public void GetMyProperties(object obj) 
{ 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
     if (!Helper.IsCustomType(pinfo.PropertyType)) 
     { 
      string s = pinfo.GetValue(obj, null).ToString(); 
      propArray.Add(s); 
     } 
     else 
     { 
      object o = pinfo.GetValue(obj, null); 
      GetMyProperties(o); 
     } 
    } 
} 

的情況是,我有ArrayClass的對象,並ArrayClass有兩個屬性:

-string Id 
-DeptArray[] depts 

DeptArray是另一個類與2個屬性:

-string code 
-string value 

所以,這個方法得到ArrayClass的一個對象。我想要讀取所有屬性從上到下並將名稱/值對存儲在字典/列表項中。我能夠做到價值,自定義,枚舉類型。我被對象數組卡住了。不知道該怎麼做。

+0

嗨,我沒有看到你的代碼,你試圖實現。 該代碼不會編譯,因爲pInfo.GetValue返回一個對象,而不是一個字符串。 – Adam 2011-02-02 20:05:36

+0

對不起。我編輯了代碼以將ToString()添加到pInfo.GetValue()。我不得不做出這個方法。該方法最初有一些複雜的邏輯。爲了簡化,我需要閱讀所有屬性,屬性的屬性和它們的值。 – 2011-02-02 20:12:43

回答

15

試試這個代碼:

public static void GetMyProperties(object obj) 
{ 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
    var getMethod = pinfo.GetGetMethod(); 
    if (getMethod.ReturnType.IsArray) 
    { 
     var arrayObject = getMethod.Invoke(obj, null); 
     foreach (object element in (Array) arrayObject) 
     { 
     foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties()) 
     { 
      Console.WriteLine(arrayObjPinfo.Name + ":" + arrayObjPinfo.GetGetMethod().Invoke(element, null).ToString()); 
     } 
     } 
    } 
    } 
} 

我測試過此代碼,它通過反射正確解析陣列。

0

您需要檢索屬性值對象,然後調用GetType()。然後,你可以做這樣的事情:

var type = pinfo.GetGetMethod().Invoke(obj, new object[0]).GetType(); 
if (type.IsArray) 
{ 
    Array a = (Array)obj; 
    foreach (object arrayVal in a) 
    { 
     // reflect on arrayVal now 
     var elementType = arrayVal.GetType(); 
    } 
} 

僅供參考 - 我從一個遞歸對象格式化方法(我現在會用JSON序列化吧)拉此代碼。

+0

不,我的意思是GetGetMethod。你爲什麼要調用GetSetMethod?你不是試圖讀取屬性,並且它是否是一個DeptArray數組遍歷元素並讀取它們? – JohnOpincar 2011-02-02 20:31:31

相關問題