将派生类的列表转换为仍返回派生类对象的基类列表

Sam*_*ngo 4 c# base-class derived-class

我有以下代码:

public class BaseClass
{
    public string A { get; set; }
}

public class DerivedClass : BaseClass
{
    public string B { get; set; }
}


List<DerivedClass> _derivedClass = new List<DerivedClass>() 
                                       { 
                                           new DerivedClass() 
                                             { A = "test1",
                                               B = "test2"
                                             }
                                       }; 

List<BaseClass> _baseClass = _derivedClass.Cast<BaseClass>.ToList();
Run Code Online (Sandbox Code Playgroud)

代码编译没有任何错误,但是,我希望_baseClass只包含属性A(类型的对象BaseClass),但它同时返回AB属性(类型的对象DerivedClass).我错过了什么以及将派生类的List转换为其基类列表的正确方法是什么?

谢谢.

Ree*_*sey 12

我错过了什么以及将派生类的List转换为其基类列表的正确方法是什么?

该列表仍然包含该实例DerivedClass,但它们被用作对它的引用BaseClass.

但是,此API的任何消费者都不会知道这一点,因此他们会将此视为BaseClass元素.

这很常见,通常是正确的方法.如果您需要实例实际转换BaseClass实例(这可能不是必需的),您需要实际BaseClassDerivedClass成员创建新实例,即:

List<BaseClass> _baseClass = _derivedClass.Select(dc => new BaseClass {A = dc.A}).ToList();
Run Code Online (Sandbox Code Playgroud)

这通常没有必要,你目前的方法可能很好.在里氏替换原则规定,任何DerivedClass应在任何情况下为是可用的BaseClass,因为你做了应该罚款这意味着刚刚返回列表.