首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在List<Interface>中将List<Class>转换为c#

如何在List<Interface>中将List<Class>转换为c#
EN

Stack Overflow用户
提问于 2017-06-21 07:03:16
回答 4查看 11.1K关注 0票数 12

我有一个接口定义为

代码语言:javascript
复制
public interface IReaderInfo
{
    string Displayname {get;}
}

以及实现该接口的类。

代码语言:javascript
复制
public class ReaderInfo : IReaderInfo
{
    string DisplayName {get;}
}

然后我创建了一个返回列表的函数。

代码语言:javascript
复制
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.
}

我该怎么投?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-06-21 07:07:18

您必须创建一个新列表,其中包含已抛出的项:

代码语言:javascript
复制
var readers = Ireaders.Cast<ReaderInfo>().ToList();

或者,如果有可能有不兼容的IReaderInfo条目,并且您只希望得到结果中的实际ReaderInfo对象:

代码语言:javascript
复制
var readers = Ireaders.OfType<ReaderInfo>().ToList();
票数 24
EN

Stack Overflow用户

发布于 2017-06-21 07:18:48

快速和非常脏的修复是只传递实际上是ReaderInfo的对象,使用OfType<>。如果任何对象实现了Cast<>而实际上不是ReaderInfo,那么使用ReaderInfo就会失败。

代码语言:javascript
复制
var Ireaders = someobject.Getreaders();
var readers=Ireaders.OfType<ReaderInfo>().ToList();
return readers;

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

为什么要抛弃他们中的一些?当所有实现相同的接口时,GetReaders为什么要决定使用哪些对象和丢弃哪些对象?

代码语言:javascript
复制
public IList<IReaderInfo> GetReaders
{
    var readers = new List<ReaderInfo>();
    var Ireaders = someobject.Getreaders();// Returns the list of IReaderInfo.
    return Ireaders;
}

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

更新

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

在谷歌上搜索IReaderInfo时,我找到了几个页面,这些页面都提到了RFID阅读器。ReaderInfo返回读取器的功能,但是如何为新读取器公开新特性?

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

票数 4
EN

Stack Overflow用户

发布于 2017-06-21 07:07:06

使用LINQ:

代码语言:javascript
复制
Ireaders.Cast<ReaderInfo>().ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44668956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档