我有一个接口定义为
public interface IReaderInfo
{
    string Displayname {get;}
}以及实现该接口的类。
public class ReaderInfo : IReaderInfo
{
    string DisplayName {get;}
}然后我创建了一个返回列表的函数。
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.
}我该怎么投?
发布于 2017-06-21 07:07:18
您必须创建一个新列表,其中包含已抛出的项:
var readers = Ireaders.Cast<ReaderInfo>().ToList();或者,如果有可能有不兼容的IReaderInfo条目,并且您只希望得到结果中的实际ReaderInfo对象:
var readers = Ireaders.OfType<ReaderInfo>().ToList();发布于 2017-06-21 07:18:48
快速和非常脏的修复是只传递实际上是ReaderInfo的对象,使用OfType<>。如果任何对象实现了Cast<>而实际上不是ReaderInfo,那么使用ReaderInfo就会失败。
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>,可以防止方法处理有效对象
更新
版本控制是不应该将接口转换为具体类型的另一个非常强烈的原因。
在谷歌上搜索IReaderInfo时,我找到了几个页面,这些页面都提到了RFID阅读器。ReaderInfo返回读取器的功能,但是如何为新读取器公开新特性?
在不破坏兼容性的情况下,公开新特性的一个常见方法是引入一个实现旧接口IReaderInfo的新类,并通过新接口(如IReaderInfo2 )公开新特性。或者使用IReaderInfo2扩展现有的类。库可以这样做,因为客户端只能通过接口工作,而不是直接针对具体的类工作。
发布于 2017-06-21 07:07:06
使用LINQ:
Ireaders.Cast<ReaderInfo>().ToList();https://stackoverflow.com/questions/44668956
复制相似问题