2012-08-10 150 views
0

我想將基礎類實例列表中的信息投影到派生類實例列表中,但我一直在投入轉換異常。這是我想要做的一個例子...我如何使它工作?C#和基礎派生類Casting

以下代碼在http://ideone.com/CaXQS,如果有幫助...提前致謝!

using System; 
using System.Collections.Generic; 

namespace AddingReversedNumbers 
{ 
     public class MyDerivedClass : MyBaseClass, IMyInterface 
     { 
       public int InterfaceProperty { get; set; } 
       public int DerivedClassProperty { get; set; } 
       public List<int> DerivedClassList { get; set; } 
     } 

     public class MyBaseClass 
     { 
       public int BaseClassProperty { get; set; } 
     } 

     public interface IMyInterface 
     { 
       int InterfaceProperty { get; set; } 
     } 

     class Program 
     { 
       static void Main() 
       { 
         //// This code works just fine. 
         //var derivedList = new List<MyDerivedClass>(); 
         //derivedList.Add(new MyDerivedClass { BaseClassProperty = 10, DerivedClassProperty = 20, InterfaceProperty = 30 }); 
         //derivedList.Add(new MyDerivedClass { BaseClassProperty = 20, DerivedClassProperty = 40, InterfaceProperty = 60 }); 
         //var baseList = derivedList.ConvertAll(x => (MyBaseClass)x); 

         // This code breaks when ConvertAll() is called. 
         var baseList = new List<MyBaseClass>(); 
         baseList.Add(new MyBaseClass{ BaseClassProperty = 10 }); 
         baseList.Add(new MyBaseClass{ BaseClassProperty = 20 }); 
         var derivedList = baseList.ConvertAll(x => (MyDerivedClass)x); 
       } 
     } 
} 
+2

內的項目'baseList'的類型MyDerivedClass'的'沒有,所以演員總是失敗......你究竟想完成什麼? – 2012-08-10 19:52:12

+1

我認爲這更好地描述爲'上傳'。是否有理由不直接將DerivedClass的實例添加到列表? – mclark1129 2012-08-10 19:53:05

+0

對於列表中的每個項目,我想使用MyBaseClass中的所有信息填充MyDerivedClass的一個新實例。 – 2012-08-10 19:53:34

回答

5

在你ConvertAll代碼你只是鑄造。您不能將基類實例轉換爲派生類實例。例如,您希望鑄造objectFileStream來做什麼?它會引用哪個文件?

如果你想在ConvertAll投影創建對象,只要做到這一點:

var derivedList = baseList.ConvertAll 
     (x => new MyDerivedClass { BaseClassProperty = x.BaseClassProperty }); 
+0

這是我目前正在做的,但我希望避免明確編碼冗餘映射。 – 2012-08-10 19:56:12

+5

我不認爲你可以避免映射,但如果有意義的話,你總是可以在MyDerivedClass上添加一個構造函數,它接受一個MyBaseClass來在一個地方封裝兩者之間的映射。 – mclark1129 2012-08-10 19:58:16

+0

這不是我希望的答案,但它仍然是答案。謝謝! – 2012-08-11 00:18:11