繁体   English   中英

我如何转换列表 <Interface> 列表 <Class> 在c#中

[英]How do i convert a List<Interface> to List<Class> in c#

我有一个定义为的接口

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.
}

我该如何施展它?

您必须使用已铸造的项目创建新列表:

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

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

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

快速而非常脏的修复是通过使用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>可以防止方法处理有效对象

UPDATE

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

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

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

使用LINQ:

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

通过使用Linq

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM