如何从具体实现转换为.NET中的接口

时间:2014-12-04 07:59:05

标签: .net generics

我正在调整一个与车辆旅程相关的图书馆,为了这个问题的目的,有两个对象。我碰巧使用vb,但这对于讨论来说是无关紧要的,除了我可以在下面的文本中表达泛型,而不需要编辑器吃尖括号

第一个是Trip对象,它实现了ITrip接口。第二个是实现接口IHop的Hop对象。 Trip和Hop对象都具有不属于接口的功能,但在内部逻辑中使用。

ITrip接口有一个只读属性,名为Route,它是一个IList(IHop)

我想在内部使用List(of Hop)实现它,原因是Trip对象逻辑需要使用Friend函数调整Hop的内容。

我无法提供实现Route属性的代码,因为我无法(显然)从对象转换为其接口。是否有可能,如果是这样的话?

1 个答案:

答案 0 :(得分:2)

Hop转换为IHop是一件微不足道的事情 - 不需要语法。同样,从List<Hop>投射到IList<Hop>也是微不足道的。

但是,您不能简单地将List<Hop>转换为List<IHop>(或IList<...>),因为它们不兼容。编译器阻止您犯错:List<Hop>只能包含Hop个(或Hop的子类) - 但是,List<IHop>可以包含我的随机{{ 1}}。如果此演员工作,则允许:

SomeClass : IHop

基本上,您需要重新创建不同类型的列表。 List<Hop> hops = ... List<IHop> evil = hops; evil.Add(new SomeClass()); // boom! class SomeClass : IHop { } // but not a Hop 可能有用:

ConvertAll

您也可以使用(可能更方便,但效率更低):

List<Hop> hops = ...
List<IHop> ihops = hops.ConvertAll(x => (IHop)x);
// or: IList<IHop> ihops = ...

附加:请注意var ihops = hops.Cast<IHop>().ToList(); IEnumerable<out T> 可以直接投放,这要归功于差异:

IReadOnlyList<out T>