简体   繁体   English

转换IList <Derived> 到IReadOnlyCollection <Base>

[英]convert IList<Derived> to IReadOnlyCollection<Base>

I have a private field IList<DerivedClass> _elements and want to create a property returning IReadOnlyCollection<BaseClass> . 我有一个私有字段IList<DerivedClass> _elements并且想要创建一个返回IReadOnlyCollection<BaseClass>的属性。

public IReadOnlyCollection<BaseClass> BaseClasses
{
    get { return _elements; } // compile time error
}

How to do that without running into compile errors? 如何做到这一点而又不会遇到编译错误?

(afaik this should work, as the T in IReadOnlyCollection<T> is covariant) (AFAIK这应该工作,作为TIReadOnlyCollection<T>是协变)

Use List<T>.AsReadOnly() method: 使用List<T>.AsReadOnly()方法:

public IReadOnlyCollection<BaseClass> BaseClasses
{
    get { return _elements.Cast<BaseClass>().ToList().AsReadOnly(); }
}

Or since IReadOnlyCollection<T> is covariant you can skip Cast<BaseClass> : 或者因为IReadOnlyCollection<T>是协变的,所以可以跳过Cast<BaseClass>

public IReadOnlyCollection<BaseClass> BaseClasses
{
    get { return _elements.ToList().AsReadOnly(); }
}

You could even skip ToList() if your field was List<T> , not IList<T> . 如果您的字段是List<T>而不是IList<T> ,那么您甚至可以跳过ToList()

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

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