簡體   English   中英

無法將通用列表轉換為自定義列表類型

[英]Unable to cast Generic List to Custom List type

我有兩個班:

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>

我發現了一些相關的問題,都是關於協方差的。 這個問題與我的問題最相似,但我不知道如何調整答案來解決我的問題。

我的問題:
如何從DB記錄中構建MyList實例?

我正在使用C#和.NET 4.0

每個MyList都是List<MyClass> ,但不是每個List<MyClass>都是MyList 例如,如果MyList上有自定義屬性,Linq的ToList方法就不會知道它。

您可以使用List<T>復制構造函數創建一個新的MyList

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

編輯

正如@ekolis所說,你需要明確地“繼承” List<T>拷貝構造函數:

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

我還會退一步看看你是否真的需要一個MyList類,或者你是否只能使用List<MyClass> (或者甚至只是IEnumerable<MyClass> )。

您可以將派生類強制轉換為基類,但不能以其他方式執行。 如果你有這個:

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

您可以將DerivedBase ,但不能將BaseDerived

Base b = (Base)new Derived();

會工作但不會

Derived d = (Derived)new Base();

Derived類可能比Base類有更多的信息,這就是原因

在您的情況下,@D Stanley為您提供了解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM