2017-09-04 26 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>>接口这种方式。