2011-03-16 198 views
1

我有什麼似乎是一個簡單的問題,但我似乎無法找到答案。我有一個屬性類。其中一個屬性返回一個List。我有一個循環遍歷任何類的所有屬性的方法,併爲該類(通信日誌應用程序)生成一個TreeNode。當我遇到標識爲List的財產時,我不知道如何正確投射Property.GetValue。 Property.PropertyType是已知的,但是我試過,我得到一個編譯錯誤或運行時錯誤。Casting C#List <>

這裏就是我試圖做...

foreach (PropertyInfo prop in props) 
{ 
    if(prop.PropertyType.Namespace == "System.Collections.Generic") 
    { 
     List<object> oList = prop.GetValue(data, null); 
     MessageBox.Show(oList.Count.ToString()) 
    } 
} 

如果我把一個斷點上的GetValue線,prop參數都知道,它是用三個要素「MyClass的」物品清單。我只是不能將它轉換爲對象列表(這可能很好),或者將其轉換爲實際的「myclass」元素列表,這些列表會更好。如何將PropertyInfo.GetValue(一個對象)的返回值轉換爲List?

+0

如果你做var oList = prop.GetValue()它會返回正確的類型嗎? – taylonr 2011-03-16 11:39:44

+0

關聯[Casting List - 協方差/逆變問題](http://stackoverflow.com/questions/4931789/casting-listt-covariance-contravariance-problem)。 – 2011-03-16 11:49:48

回答

1

,您是否試圖

prop.GetValue(data, null) as List<YourClass>; 
+0

問題的核心在於「YourClass」會因我嘗試記錄的每個不同對象而異。該屬性知道它是什麼樣的列表,但我不能在任何程序中放入<>。如果我這樣做,我得到一個編譯器錯誤。我也有其他答案的這個問題。如果我想通過檢查屬性的類型來做到這一點,但我似乎無法找到將要工作的<>的內容。 – 2011-03-16 12:17:43

3

首先,這是不夠的(或在這種情況下,在所有需要)來檢查命名空間。您可以檢查prop.PropertyType是否是ICollection的實例(您可以使用IsAssignableFrom)。我建議ICollection,因爲你似乎只關心伯爵。

然後,您可以將其轉換爲ICollection的(非通用),然後運行Enumerable.Cast,如:

IEnumerable<MyClass> res = ((ICollection)prop.GetValue(data,null)).Cast<MyClass>(); 
MessageBox.Show(res.Count().ToString()); 

的優勢直接轉換成列表的是,這將與任何收集工作。但如果你不需要,你可以嘗試其他答案的建議。

+0

你是男人(當然性別inspecific)! IEnumerable是我需要的。因爲遞歸函數需要對象而不是特定的類類型,所以我可以將其轉換爲對象列表。這工作完美。非常感謝。至於IsAssignableFrom ....我該如何使用它? – 2011-03-16 12:30:55

+0

如果(ICollection.IsAssignableFrom(prop.PropertyType)){...} – sinelaw 2011-03-16 12:48:20

0

我想你想要反轉。

你想這樣做嗎?

List<object> list = (List<Product>)object; 

List<object>List<Product>不會被視爲相同的類型。

C#4.0引入了接口和委託泛型參數的協方差和反變量,但無論如何,IList<T>沒有反轉。

根據我的看法,我相信你需要重新考慮你的對象圖!

PD:只是評論,如果你想要的指導!