编译时检查带有接口的字典条目类型的正确性

时间:2017-09-04 12:52:55

标签: c# types interface compiler-errors

我正在寻找一种定义IDictionary<List<IInterface>, HashSet<IInterface>>的方法,以便对于每个键值对,实现IInterface的类型是相同的。

我们说我有两种类型T1T2来实现IInterface

然后应该可以添加键值对

  1. List<T1>HashSet<T1>
  2. List<T2>HashSet<T2>
  3. 但是不应该添加类型的键值对

    1. List<T1>HashSet<T2>
    2. List<T2>HashSet<T1>
    3. 是否可以定义这样的字典,以便每当我尝试添加禁用的键值对时都会出现编译错误?如果是,怎么样?

      如果我需要一个或几个新的类,接口等,我不在乎。我只是想知道原则上是否可行。

1 个答案:

答案 0 :(得分: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>>接口。< / p>