Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有方法将通用列表/字典强制转换为包含对象的任何实现接口_C#_Generics_Casting - Fatal编程技术网

C# 是否有方法将通用列表/字典强制转换为包含对象的任何实现接口

C# 是否有方法将通用列表/字典强制转换为包含对象的任何实现接口,c#,generics,casting,C#,Generics,Casting,有没有一种方法可以将泛型集合强制转换到由存储对象实现的任何接口 因此,我们的想法是让用户可能只通过转换底层存储对象的接口定义来公开底层字典或列表。对于列表,似乎可以使用IEnumerable或IReadonlyList,但字典呢 public interface IMyClass { ... } public class MyClass : IMyClass { ... } public class AccessClass { List<MyClass> _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>;
    }

}

公共接口IMyClass
{
...
}
公共类MyClass:IMyClass
{
...
}
公共类访问类
{
列表_List=新列表();
字典_dic=新字典();
公共IList对象列表
{
//有没有办法做到这样的演员阵容?
得到{
将_列表返回为IList;
}
公共词典反对书
得到{
//有没有办法做到这一点?
返回作为索引的dic;
}
}
(如注释中所述…)

不能使用
List
执行此操作的原因是它与所有类一样是不变的。只有委托和接口支持通用协方差,这正是您在这里想要的

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

public-IReadOnlyList-ObjectList=>\u-list;
如果呼叫者需要对列表进行写访问,那么不管怎样,您都会遇到更大的问题,因为您需要考虑以下情况会发生什么:

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

在您询问有关
字典的评论中
——不幸的是,我不知道任何辅助字典类型。您可以创建自己的包装器类型,实现您自己定义的接口,但这并不是非常独特。

您必须使用
IList
而不是
IEnumerable
?您可以由于泛型差异,d已经返回了
IEnumerable
。@Jonsket:好的,这是一种可能性。但我认为IEnumerable没有索引访问权限。当我使用Dictionary时,同样的问题也会出现。
IReadOnlyList
将是一个具有索引访问权限的选项。但是对于Dictionary,我不知道有什么好的选项,例如
IReadOnlyDictionary
是不变的。@Jonsket:听起来很有趣,而且很有帮助,谢谢!这在大多数情况下都会很明显地解决泛型列表的问题。如果真的有兴趣的话,是否存在类似的字典方法…@FlorianStorck:只是添加了一个注释,说我不相信有这样的事情。