我遇到了运行时异常,无法弄清原因
无法转换类型的对象 'System.Collections.Generic.List`1 [Foo.ElementNameViewModel]' 输入 “ Foo.ElementNameList”。
我上的课是
ElementNameList -特定类型的列表
namespace Foo
{
public class ElementNameList : List<ElementNameViewModel> {}
}
ElementNameViewModel -列表中的项目
namespace Foo
{
public class ElementNameViewModel
{
public string Symbol { get; set; }
public string Name { get; set; }
}
}
,并且异常发生在
var elements = (ElementNameList) db.Elements
.Select(c => new ElementNameViewModel
{
Symbol = c.Symbol,
Name = c.Name
})
.OrderBy(e => e.Symbol)
.ToList();
如果子类列表未完成,则不确定如何重构元素列表。
答案 0 :(得分:1)
ToList()
返回一个真实的System.Collections.Generic.List
实例,而不是您的ElementNameList
。
您可以将ElementNameList
投射到IList<ElementNameViewModel>
或List<ElementNameViewModel>
,但不能用其他方式投射。
原因是因为您的ElementNameList
可能具有List<ElementNameViewModel>
没有的属性。如果您在投射后尝试访问该属性会发生什么?
public class ElementNameList : List<ElementNameViewModel> {
public int X { get; set; }
}
var list = new List<ElementNameViewModel>();
ElementNameList elementList = (ElementNameList) list;
int x = elementList.X; // List<ElementNameViewModel> doesn't have 'X' property, what would happen here?
答案 1 :(得分:1)
如Optimistic Peachs'和lmcarreiro's one之类的其他答案中所述,ToList()
LINQ扩展方法返回一个
基本的List<T>
对象,而不是您自定义的ElementNameList
类的对象。
要解决您眼前的问题,我将其写为:
var qry = db.Elements
.Select(c => new ElementNameViewModel
{
Symbol = c.Symbol,
Name = c.Name
})
.OrderBy(e => e.Symbol);
var elements = new ElementNameList();
elements.AddRange(qry);
我现在没有Visual Studio,可以查看是否需要
在qry.ToList()
通话中使用AddRange
,但我相信
足够。
顺便说一句,为什么必须对列表进行子类化?
答案 2 :(得分:0)
向继承/派生成员进行铸造只是一种方式...那就是派生层次。
例如:
class Animal{
int number_of_legs;
}
class Cat: Animal{
string current_sound = "meow";
}
如果您创建了一个动物(在这种情况下,实际上应该是抽象的,但是可以忽略它)并想将其转换为猫,然后将其分配给变量mycat
,那么{ {1}}是?无法推断出它是因为mycat.current_sound
拥有Cat
拥有的所有成员并且还有 more ,因此从Animal
到Cat
的转换会使您迷失方向Animal
拥有的成员,并且仅与Cat
的成员保持联系(除非您再次投射,但这无关紧要...)
P.S。我最近一直在用另一种语言进行编码,所以请原谅我对变量的命名和代码格式