2014-02-10 124 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