2014-02-06 94 views
2

如何在集合中處理不同的泛型類(共享基類型)?

public class BaseClass { 
public string Name; 
} 

public class A<T> : BaseClass { 
public T Value; 
public Action<T> ToDo; 
} 

public List<BaseClass> MyList; 

我填MYLIST與

A<int>, A<double>, A<SomeUnknownType>. 

當處理MYLIST的元素,我想打電話給待辦事項(價值),而不必知道什麼特異性T在每種情況下。

+4

當前計數結果(又名「項目」)之間typeof比較如果您需要區分不同的子類,爲什麼要將它們全部放在同一個列表中?你想達到什麼目的?通常,子類化的全部目的是消耗代碼不需要能夠區分不同的實現。 – recursive

+0

@recursive子類化的要點(或當前使用)是*代碼重用/共享* - 子類型多態是一種不幸的OO趨勢,IMOHO :(單獨的接口足以使實現無關緊要 – user2864740

+0

項目如何在列表中「以後使用」? – user2864740

回答

2

味道不好,但你可以試試這個:

foreach (var item in MyList) 
{ 
    if (item.GetType().IsGenericType) 
    { 
     Type genericType = item.GetType().GetGenericArguments()[0]; 
     ... 
    } 
} 

,你會得到通用型到genericType變量。

爲了確定類型是一個,你可以這樣做:

bool isA = item.GetType().GetGenericTypeDefinition().Equals(typeof(A<>)); 
+0

不錯,但是我們如何確定類型是'A'還是'B'? –

+2

也許用'item.GetType().GetGenericTypeDefinition()。Equals(typeof(A <>))' – thepirat000

-1

,你可以簡單地使用像if(item.GetType().Equals(typeof(A<>))

+1

不,他不能。因爲'A!= A ' –

+0

實際上'T'類型在這裏並不重要(所以它似乎)...但我更新了答案 – Leonardo

+0

它確實重要。請參閱OP的評論。只是他沒有提供他的全部class.by the way that does not work either.item.GetType()。Equals(typeof(A <>)'你應該嘗試 –

相關問題