2013-06-26 92 views
0

我需要一個字典,可以這樣做:辭典類型值

Dictionary properties = new Dictionary(); 
properties.Add<PhysicalLogic>(new Projectile(velocity)); 

// at a later point 
PhysicalLogic logic = properties.Get<PhysicalLogic>(); 

我發現this製品,它類似於我想要的東西,但並不完全。

Unity3D做它用自己GetComponent<>()方法,所以它應該是可能的: http://docs.unity3d.com/Documentation/ScriptReference/GameObject.GetComponent.html (點擊「JavaScript的」下拉列表中看到C#版本)

回答

4

沒有內置的類,它這一點。

public class TypedDictionary { 
    private readonly Dictionary<Type, object> dict = new Dictionary<Type, object>(); 

    public void Add<T>(T item) { 
     dict.Add(typeof(T), item); 
    } 

    public T Get<T>() { return (T) dict[typeof(T)]; } 
} 

注意,這將根據他們的編譯時類型添加項目,並且您將無法解析:

您可以通過包裝一Dictionary<Type, object>和鑄造結果Get<T>()自己寫一個使用除確切類型以外的任何東西(與基本類型或可變換類型相反)。

如果你想克服這些限制,可以考慮使用完整的IoC系統,比如Autofac,它可以完成所有這些工作。

字典不能幫助那裏,因爲類型可轉換性不是等價關係。
例如,stringint都應計爲object,但這兩種類型不相等。

+0

這很好。無論如何,我可以得到像這樣的東西來處理它呢? properties.Add (someVar); –

1

嚴格按照你的例子(即一類只能有一個條目)就可以實現這個雙向的:

自定義詞典

public class TypedDictionary : Dictionary<Type, object> 
{ 
    public void Add<T>(T value) 
    { 
     var type = typeof (T); 

     if (ContainsKey(type)) 
      this[type] = value; 
     else 
      Add(type, value); 
    } 

    public T Get<T>() 
    { 
     // Will throw KeyNotFoundException 
     return (T) this[typeof (T)]; 
    } 

    public bool TryGetValue<T>(out T value) 
    { 
     var type = typeof (T); 
     object intermediateResult; 

     if (TryGetValue(type, out intermediateResult)) 
     { 
      value = (T) intermediateResult; 
      return true; 
     } 

     value = default(T); 
     return false; 
    } 
} 

擴展方法

public static class TypedDictionaryExtension 
{ 
    public static void Add<T>(this Dictionary<Type, object> dictionary, T value) 
    { 
     var type = typeof (T); 

     if (dictionary.ContainsKey(type)) 
      dictionary[type] = value; 
     else 
      dictionary.Add(type, value); 
    } 

    public static T Get<T>(this Dictionary<Type, object> dictionary) 
    { 
     // Will throw KeyNotFoundException 
     return (T) dictionary[typeof (T)]; 
    } 

    public static bool TryGetValue<T>(this Dictionary<Type, object> dictionary, out T value) 
    { 
     var type = typeof (T); 
     object intermediateResult; 

     if (dictionary.TryGetValue(type, out intermediateResult)) 
     { 
      value = (T) intermediateResult; 
      return true; 
     } 

     value = default(T); 
     return false; 
    } 
} 

第一種方法更明確,因爲另一種方法只需要特定ic類型的字典。