2013-02-11 49 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