如何在C#中将List <interface>转换为List <class>

时间:2017-06-21 07:03:17

标签: c# oop casting

我有一个定义为

的界面
public interface IReaderInfo
{
    string Displayname {get;}
}

以及实现该接口的类

public class ReaderInfo : IReaderInfo
{
    string DisplayName {get;}
}

然后我创建了一个返回List

的函数
public List<ReaderInfo> GetReaders
{
     var readers = new List<ReaderInfo>();
     var Ireaders = someobject.Getreaders();// Returns the list of IReaderInfo.
     // Now i would like cast Ireaders as readers and return.
}

我如何施展它?

4 个答案:

答案 0 :(得分:7)

您必须使用已投放项目创建新列表:

var readers = Ireaders.Cast<ReaderInfo>().ToList();

或者,如果有可能存在不兼容的IReaderInfo条目,并且您只想在结果中使用实际的ReaderInfo对象:

var readers = Ireaders.OfType<ReaderInfo>().ToList();

答案 1 :(得分:2)

快速和非常脏的修复方法是使用OfType<>仅传递实际 ReaderInfo的对象。如果任何对象实现IReaderInfo而没有实际 一个ReaderInfo

,则使用Cast<>将失败
var Ireaders = someobject.Getreaders();
var readers=Ireaders.OfType<ReaderInfo>().ToList();
return readers;

更好的解决方案是更改方法的签名以返回List<IReaderInfo>或更抽象的IList<IReaderInfo>。如果GetReaders返回接口列表,则表示它可以返回实现该接口的任何对象。

为什么要丢弃部分?为什么GetReaders决定使用哪些对象以及在实现相同的接口时丢弃哪些对象?

public IList<IReaderInfo> GetReaders
{
    var readers = new List<ReaderInfo>();
    var Ireaders = someobject.Getreaders();// Returns the list of IReaderInfo.
    return Ireaders;
}

例如,方法通常在执行打算返回不同类型(例如模拟对象)或处理多个实现时返回接口。通过返回List<ReaderInfo>,可以防止方法处理有效对象

<强>更新

版本控制是另一个非常强大的原因,一个不应将接口转换为具体类型。

Google搜索IReaderInfo我发现有几页涉及RFID阅读器。 ReaderInfo返回阅读器的功能,但是如何为新阅读器公开功能?

在不破坏兼容性的情况下公开新功能的常用方法是引入一个实现旧接口IReaderInfo的新类,并通过新接口公开新功能,例如IReaderInfo2。或者现有的类可以使用IReaderInfo2进行扩展。库可以做到这一点,因为客户只能通过接口工作,而不是直接针对具体类。

答案 2 :(得分:0)

使用LINQ:

Ireaders.Cast<ReaderInfo>().ToList();

答案 3 :(得分:0)

使用Linq

var derivedList = Ireaders.Cast<ReaderInfo>();