2009-04-16 47 views
12

我所在班級的相關部分看起來像添加通用對象泛型列表在C#

class C { 
    void Method<T>(SomeClass<T> obj) { 
     list.Add(obj); 
    } 
    List<?> list = new List<?>(); 
} 

我應該如何定義,使類編譯名單?

我想要一個List<SomeClass<?>>類型的列表,這是一個SomeClass對象的列表,其中每個對象可以有任何類型參數。 Java ?構造允許這樣做;什麼是C#等價物?如果不存在這種情況,是否有適當的解決方法? (A List<object>會做,但是非常難看。)

+0

您能否詳細說明您希望通過「方法」功能添加的項目? – el2iot2 2009-04-16 00:53:46

+0

啊,沒關係,我在評論中看到它。 – el2iot2 2009-04-16 00:55:13

+0

在c#4.0中,您可以將SomeClass聲明爲動態,而不是使用泛型。該列表然後變成列表。 – Goran 2011-03-03 01:00:44

回答

13

我不認爲你可以在C#這樣做......你將不得不類型參數添加到類:

class C<T> { 
    void Method(SomeClass<T> obj) { 
     list.Add(obj); 
    } 
    List<SomeClass<T>> list = new List<SomeClass<T>>(); 
} 

其他選項將使用一個接口:

class C { 

    void Method<T>(T obj) 
     where T : ISomeClass { 
     list.Add(obj); 
    } 
    List<ISomeClass> list = new List<ISomeClass>(); 
} 
2

不幸的是,在C#3.0中沒有直接的等價物,因爲泛型是不變的。 您可以使用C#4.0安全co/contra-variance功能以優雅的方式執行此類操作。 要解決該問題,您可以從非泛型基地繼承​​SomeClass<T>,並改爲創建List<BaseClass>。 如果該類的每個實例只能保存一種類型,則可以將該類自身設置爲通用類型,並在其中設置類型參數。

4

要做你想做的事,你有兩個選擇。

您可以使用列表<對象>,並處理對象。這不會是類型安全的,並且對於值類型將具有裝箱/拆箱問題,但它會起作用。

您的其他選項是使用通用約束來限制基類或接口,並使用列表<接口>。

2

我對Java的?結構一無所知,但我認爲以下幾點最貼近地保留了您現有的語法,同時也符合您的描述。

class SomeClass<T> 
    { 
    } 

    class C 
    { 
     void Add<T>(SomeClass<T> item) 
     { 
      Type type = typeof(SomeClass<T>); 
      if (!list.ContainsKey(type)) 
       list[type] = new List<SomeClass<T>>(); 
      var l = (List<SomeClass<T>>)list[type]; 
      l.Add(item); 
     } 

     public void Method<T>(SomeClass<T> obj) 
     { 
      Add(obj); 
     } 
     readonly Dictionary<Type, object> list = new Dictionary<Type, object>(); 
    } 

具有以下測試:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var c = new C(); 
      var sc1 = new SomeClass<int>(); 
      var sc2 = new SomeClass<String>(); 
      c.Method(sc1); 
      c.Method(sc2); 
      c.Method(sc1); 
      c.Method(sc2); 
     } 
    } 
0

就個人而言,我會做這在可能的情況;將通用參數從方法移到該類。

class C<T> { 
    void Method(SomeClass<T> obj) { 
     list.Add(obj); 
    } 
    List<?> list = new List<?>(); 
} 

如果您的通用列表是一個成員,則認爲應該在構建這個類時考慮到這一點。我們很難在沒有更多的課堂使用情境的情況下提出最佳模式。