2013-05-10 64 views
3

我有兩類:無法投泛型列表到自定義列表類型

public class MyClass 
{ 
    public int Foo { get; set; } 
    public string Bar { get; set; } 
} 

public class MyList : List<MyClass> 
{ 
} 

在其他的代碼,我從一個數據庫的每條記錄創建的MyClass情況下,我想回報他們所有在MyList實例:

var records = _repository.GetRecords(); 
return (MyList) records.Select(x => x.ConvertTo<MyClass>()).ToList(); 

代碼編譯罰款,但它拋出一個運行InvalidCastException

無法投射'System.Collections.Generic.List`1 [MyClass]'類型的對象來鍵入'MyList'。

我不明白爲什麼這個錯誤發生,因爲MyList一個List<MyClass>

我發現一些相關的問題,都談論協變性。 This question與我的問題最相似,但我不知道如何調整答案來解決我的問題。

我的問題:
我怎樣才能建立一個MyList實例進行的DB記錄?

我使用C#和.NET 4.0

+2

'名單'是不是** **自動'MyList'了。儘管如此,你可以創建一個構造函數,它使用'List '。 – 2013-05-10 17:58:22

+0

*孩子*是其*母親*類型,而不是相反。一個*母親*可能有很多*孩子*。 – 2013-05-10 18:03:21

+0

CA1002:DoNotExposeGenericLists - http://msdn.microsoft.com/en-us/library/ms182142(v=vs.80).aspx ...記住這一點。 – 2013-05-10 18:17:51

回答

8

MyListList<MyClass>,但並不是每個List<MyClass>MyList。例如,如果你在MyList有一個自定義屬性中的LINQ的ToList方法將有毫不知情。

使用List<T>拷貝構造函數你可以創建MyList

return new MyList(records.Select(x => x.ConvertTo<MyClass>()).ToList()); 

編輯

由於@ekolis estutely注意到,你需要明確地 「繼承」 的List<T>拷貝構造函數:

public class MyList : List<MyClass> 
{ 
    public MyList(IEnumerable<MyClass> list) 
     : base(list) 
    { 
    } 
} 

我也退一步,看看你是否真的需要一個MyList,或者您也可以只使用List<MyClass>(甚至只是IEnumerable<MyClass>)。

+2

請注意,您實際上需要創建此複製構造函數;它不會從列表繼承。 – ekolis 2013-05-10 17:59:19

+0

「MyList」類被序列化爲XML。我使用它來代替普通的'List ',因爲後者生成一個名爲「ArrayOfMyClass」的XML元素,我希望能夠將XML元素的名稱控制爲自定義,在本例中爲「MyList」。 – 2013-05-10 19:13:39

0

你可以蒙上了派生類的基類,但你不能做的其他方式。 如果你有這樣的:

public class Base {} 
public class Derived : Base {} 

你可以施放DerivedBase,但你可以不投BaseDerived

Base b = (Base)new Derived(); 

將工作 但不

Derived d = (Derived)new Base(); 

Derived班級有可能比更多的信息類,這就是爲什麼

在你的情況@D斯坦利給你的解決方案