2014-02-12 60 views
0

我有一个列表1类型的对象复制列表中列出

public class ClassName1 
{ 

    public ClassName1() 
    { 
    } 

    public short Prop1 { get; set; } 
    public string Prop2 { get; set; } 

} 

和一个空的列表2类型的对象继承类型的具有附加属性的对象

public class ClassName2: ClassName1 
{ 
    public double Prop3; 
} 

我想通过做

IList<ClassName2> List2 = List1.Cast<ClassName2>().ToList(); 

到列表1到列表2中的内容复制,但我得到:

'InvalidCastException未处理。无法投射'Namespace.ClassName1'类型的对象以键入'Namespace.ClassName2'。

我在做什么错?

+0

ClassName2从inherites ClassName1,而不是其他方式,所以您只能从2投射到1 –

+0

您不能将父项转换为子项,反之亦然。并非每一只动物都是一只狗,但每只狗都是一只动物。或者,如果父母实际上是一个“隐藏”的孩子:“动物a =新狗()” –

回答

0

简而言之,你不能。每ClassName2ClassName1,但不是每个ClassName1ClassName2。这意味着您可以将ClassName2分配给ClassName1变量,但您不能将ClassName1分配给ClassName2变量。既然你不能为单个变量做这件事,你不能为一个列表做,反转或不变。

0

你可以做这样的事情,而不是:

IList<ClassName2> List2 = l1.Select(x => new ClassName2 { Prop1 = x.Prop1, Prop2 = x.Prop2 }).ToList(); 
0

演员是不可能的,因为你不能投了父母的孩子,但你总是可以做手工:

foreach(var item in list1) 
{ 
    List2.Add(new ClassName2{Prop1 = item.Prop1, Prop2 = item.Prop2, Prop3 = 0}) 
}