如果你想混用不同泛型類型(所以有含有MyClass<int>
和MyClass<string>
的集合),你需要定義一些常用的基本類型或使用不強類型集合:
public class MyClass<T> : MyClass
{
public T Value2 { get; set; }
}
public class MyClass
{
public string Value1 { get; set; }
public string Value3 { get; set; }
}
然後你可以這樣定義一個集合:
List<MyClass> list = new List<MyClass>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
你將不得不投結果磨片n檢索條目,以便訪問他們的Value2
屬性。
另一種選擇,以避免基類是簡單地用一個List<object>
:
List<object> list = new List<object>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
但它同樣的問題同上,但振振有詞糟糕(因爲這樣你可以在那裏存放什麼)
編輯:如何允許在非基類非MyClass
中對Value2
進行無類型訪問的方法有多種。一種方法是定義在基類的它的「類型化」版本,並覆蓋其上會進行類型檢查的子類:
public abstract class MyClass
{
public string Value1 { get; set; }
public abstract object Value2Untyped { get; set; }
public string Value3 { get; set; }
}
public class MyClass<T> : MyClass
{
public T Value2 { get; set; }
public override object Value2Untyped
{
get
{
return Value2;
}
set
{
Value2 = (T)value;
}
}
}
然後爲所有對象或集合被輸入對基礎非 - 通用MyClass
,您仍然可以訪問值,甚至可以在運行時設置值。 (set
當然是可選的)
你知道嗎,如果你想把它們放到一個集合中,你需要從對象中返回'int'和'string'? –
是的,我明白 – cableload
可能的重複/相關:http://stackoverflow.com/questions/15833397/generic-collection-in-generic-class/15833511#15833511 – Clint