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

时间:2013-02-11 17:18:24

标签: c# derived-class base-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();

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

谢谢。

1 个答案:

答案 0 :(得分:12)

  

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

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

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

这很常见,通常是正确的方法。如果您需要实际实例转换为BaseClass个实例(可能没有必要),您需要从BaseClass实际创建新的DerivedClass个实例成员,即:

List<BaseClass> _baseClass = _derivedClass.Select(dc => new BaseClass {A = dc.A}).ToList();

这通常没有必要,而且您当前的方法可能很好。 Liskov substitution principle指出任何DerivedClass在任何情况下都应该可以用作BaseClass,这意味着只需返回列表即可。