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