2013-04-18 17 views
2

我想創建一個像這樣的自定義類,如下所示。實現一個通用類的集合

public MyClass<T> 
{ 
    public string Value1 { get; set; } 
    public T Value2 { get; set; } 
    public string Value3 { get; set; } 
} 

T的值可以是字符串或int或日期時間。我認爲我可以像

MyClass<int> intclass = new MyClass<int>(); 
MyClass<String> stringclass=new MyClass<String>(); 

等創建這個類的新實例。

是否有可能創建上述類的集合,我可以將intclass和stringclass放入自定義集合中。

+0

你知道嗎,如果你想把它們放到一個集合中,你需要從對象中返回'int'和'string'? –

+0

是的,我明白 – cableload

+0

可能的重複/相關:http://stackoverflow.com/questions/15833397/generic-collection-in-generic-class/15833511#15833511 – Clint

回答

5

如果你想混用不同泛型類型(所以有含有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當然是可選的)

+1

+1將常見行爲提取到'MyClass'中 –

0

你的意思是這樣的?

List<MyClass<int>> intClassList = new List<MyClass<int>>(); 
intClassList.Add(new MyClass<int>()); 
+0

No..your example would only have a collection of base type MyClass ... where T is int..i want my custom collection to have a base type of T where T could be int/string/datetime – cableload

+0

@Marco Forberg ,OP希望處理int和字符串集合!!! – David

+0

我不知道這是否可行,因爲我發現類型安全問題 –