2014-02-10 125 views
2

我有以下类别的C#列表:继承的类

public class BaseClass() {} 
public class Class1 : BaseClass {} 
public class Class2 : BaseClass {} 

public class BaseClassList : List<BaseClass> {} 
public class Class1List : List<Class1> {} 
public class Class2List : List<Class2> {} 

的数据是JSON格式被加载为BaseClass的对象的列表。一旦加载,并希望与相关对象来填充具体名单:

public void Setup() 
{ 
    Class1List list1 = new Class1List(); 

    var query = from x in BaseClassList 
       where x.Type = MyType.Class1 
       select x; 

    list1.AddRange(query); 
} 

的AddRange但不编译,因为我想加入BaseClass的对象添加到Class1的列表。

如何成功添加继承的类?

+1

'BaseClassList'是一个类型的名称 - 或者你是否也有该类型的某些属性?也不清楚为什么你有'List '的子类 - 这通常不是一个好主意,IME。 –

回答

1

试试这个代码片段,

public void Setup() 
{ 
    Class1List list1 = new Class1List(); 

    var query = from x in BaseClassList 
      where x.GetType() == typeof(Class1) 
      select x as Class1; 

    list1.AddRange(query); 
} 

as运算符蒙上你的类型BaseClass键入Class1

参考:MSDN as Operator

正如在评论中提到,你可以做一点点更多与此片段保存:

public void Setup() 
{ 
    Class1List list1 = new Class1List(); 

    var query = from x in BaseClassList 
     where x.GetType() == typeof(Class1) 
     select x; 

    foreach(var item in query){ 
     var temp = item as Class1; 
     if(temp != null) 
     list1.Add(temp); 
    } 
} 

在投射到Class1之后,您可以检查null,因为如果无法投射,as运算符将返回null。我宁愿做一个类型比较where x.GetType() == typeof(Class1)

+1

就个人而言,如果存在具有'MyType.Class1'类型的'Type'属性的非Class1元素,我会使用cast而不是'as' - 是否真的希望它静静地进行(并添加一个'null'引用) ? –

+0

铸件总是返回零位 –

+0

@ Ivan-MarkDebono为什么要这样做? – csteinmueller