有没有一种方法可以将通用列表/字典转换为包含对象的任何已实现接口

时间:2019-11-14 14:00:54

标签: c# generics casting

是否有一种方法可以将通用集合转换为所存储对象正在实现的任何接口?

因此,我们的想法是仅通过底层存储对象的接口定义通过类型转换公开底层字典或列表。在使用List的情况下,似乎可以通过使用IEnumerable或IReadonlyList来实现,但是字典呢?

public interface IMyClass
{
 ...
}

public class MyClass : IMyClass
{
  ...
}

public class AccessClass
{
    List<MyClass> _list = new List<MyClass>();
    Dictionary<string, MyClass>  _dic = new Dictionary<string, MyClass>();
    public IList<IMyClass> ObjectList
    {
    // is there a way to achieve a cast like this ? 
    get {
        return _list as IList<MyClassInterface>;
    }

    public IDictionary<string, IMyClass> ObjectDict
    get {
    // is there a way to achieve this as well ?
        return _dic as IDictionary<string, IMyClass>;
    }

}

1 个答案:

答案 0 :(得分:1)

(如评论中所述...)

您无法使用List<T>执行此操作的原因是它是不变 -与所有类一样。仅委托和接口支持通用协方差,这就是您想要的。

如果AccessClass的调用者只需要读取条目,则可以将属性更改为IReadOnlyList<T>类型,该属性在T中是协变的。

public IReadOnlyList<IMyClass> ObjectList => _list;

如果呼叫者需要对列表的 write 访问权限,那么您仍然会遇到更大的问题,因为您需要考虑以下情况会发生什么:

access.ObjectList.Add(new SomeOtherIMyClassImplementation());

在您询问Dictionary<,>的评论中-很遗憾,我不知道任何变型字典类型。您可能会创建自己的包装器类型,以实现定义自己的接口,但这绝不是惯用语。