2017-09-04 43 views
3

我正在尋找一種方法來定義IDictionary<List<IInterface>, HashSet<IInterface>>,以便對於每個鍵 - 值對實現IInterface的類型是相同的。編譯時檢查字典輸入類型與接口的正確性

比方說,我有兩種類型T1,T2,執行IInterface

那麼它應該是可以添加一個鍵值對的類型

  1. List<T1>HashSet<T1>
  2. List<T2>HashSet<T2>

,但它不應該是可以添加的關鍵價值對

  1. List<T1>HashSet<T2>
  2. List<T2>HashSet<T1>

是否可以定義這樣一個字典,以便每當我嘗試添加一個禁用的鍵值對時都會收到編譯錯誤?如果是,如何?

我不在乎我是否需要一個或幾個新的類,接口等。我只是想知道原則上是否可行。

回答

3

我不在乎我是否需要一個或幾個新的類,接口等。

那麼在這種情況下,它大多是可能的!您可以將一個非類型安全的字典包裝在僅提供類型安全訪問的類中。

public class MyDictionary { 
    private readonly Dictionary<object, object> _innerDictionary = new Dictionary<object, object>(); 
    public void Add<T>(List<T> key, HashSet<T> value) where T : IInterface { 
     _innerDictionary.Add(key, value); 
    } 
    public HashSet<T> Get<T>(List<T> key) where T : IInterface { 
     return (HashSet<T>)_innerDictionary[key]; 
    } 
    public void Set<T>(List<T> key, HashSet<T> value) where T : IInterface { 
     _innerDictionary[key] = value; 
    } 
    // etc. 
} 

注意List<ConcreteImplementation>是無法轉換爲List<IInterface>,無論ConcreteImplementation是否實現IInterface,所以你不能實現IDictionary<List<IInterface>, HashSet<IInterface>>接口這種方式。