2013-02-11 51 views
3

的基类,还是返回对象的我有以下代码:铸造清单列出派生

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只包含物业A(类型为BaseClass的对象),但它返回AB属性(类型为DerivedClass的对象)。我错过了什么以及将派生类的列表转换为其基类列表的正确方法是什么?

谢谢。

+0

为什么你在乎它是否真的是幕后的DerivedClass? – 2013-02-11 17:20:54

+0

你是如何访问这些属性?对我来说这似乎很好...... – 2013-02-11 17:21:00

+0

嗨,大家好,看看我对@ReedCopsey的回应如下。谢谢。 – 2013-02-11 18:50:33

回答

11

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

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

但是,此API的任何使用者都不会知道这一点,所以他们会将此视为BaseClass元素。

这是常见的,通常是正确的方法。如果你需要真正转换的实例BaseClass情况下(这很可能不是必要的),你就需要实际从DerivedClass成员做出新的BaseClass情况下,即:

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

这通常是没有必要的,你目前的方法可能没问题。 Liskov substitution principle指出任何DerivedClass应该可以在任何情况下作为BaseClass使用,这意味着只要返回列表,你应该没问题。

+0

感谢您的详细回复。这是有道理的,你的解决方案工作。长话短说,我正在使用MVC 4 Web API构建一个API层,序列化程序包含派生类的属性,而不仅仅是基类。有效载荷的大小太大,我试图减少发送回客户端的数据量。 – 2013-02-11 18:49:12