我有以下代码:
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转换为其基类列表的正确方法是什么?
谢谢。
答案 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
,这意味着只需返回列表即可。