[英]Unable to cast object of type 'System.Collections.Generic.List`1
[英]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 {}
您可以將Derived
為Base
,但不能將Base
為Derived
Base b = (Base)new Derived();
會工作但不會
Derived d = (Derived)new Base();
Derived
類可能比Base
類有更多的信息,這就是原因
在您的情況下,@D Stanley為您提供了解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.