2014-06-22 98 views
1

我需要一個類型安全的多類型集合,例如,映射從通用標記類Tag<T>到類型爲T的對象。在Java中,我會寫這樣的事情:C中的多類泛型集合#

class ClassMap { 
    private HashMap<Tag<?>,?> map = new HashMap<>(); 

    <T> void put(Tag<T> tag, T value){ 
     map.put(tag,value); 
    } 

    <T> get(Tag<T> tag){ 
     return (T) map.get(tag); 
    } 
} 

集合是類型安全的,即投(T)將始終作爲集合檢查該類對應於插入標籤成功。

但如何在C#中做到這一點? Afaik,C#中沒有通配符,所以我在這裏不能寫HashMap<Tag<?>,?>。我如何告訴C#我需要一個通用映射,但無法準確指定其參數?

回答

2

你試過嗎? C#的所有等級都來自object

編輯:Object類的引用 -

http://msdn.microsoft.com/en-us/library/system.object.aspx

可強制轉換任何對象object型 -

class Tag<T>{ 

    } 
    class ClassMap { 
     private Dictionary<object, object> map = new Dictionary<object,object>(); 

     public void put<T>(Tag<T> tag, T value){ 
      map.Add(tag, value); 
     } 

     public T get<T>(Tag<T> tag){ 
      return (T)map[tag]; 
     } 
    } 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      ClassMap v = new ClassMap(); 
      Tag<Int16> t = new Tag<short>(); 
      v.put<short>(t, 10); 
      var tt = v.get<short>(t); 
     } 
    } 

調試信息 -

enter image description here

+0

這似乎是做我想要的!所以這通常是這樣的:每當我需要一個類字段,如果我用Java編寫它就會有通配符,我需要用對象(或另一個非泛型基類)替換所有通配符的類型,並且只返回一次我需要他們? – gexicide

+0

是的,這將一般工作。不過,你應該擔心性能,從'object'類型轉換是一項繁重的操作,應該儘可能地避免。 –

+0

太好了,謝謝!編輯:那麼,如果這樣的表現受到影響,是否有更好的方法來維護各種類型可能混合的集合?我看不到。 – gexicide