当LINQ查询ToList()强制转换为特定的List <t>子类时,无法强制转换对象

时间:2018-10-03 19:45:56

标签: c#

我遇到了运行时异常,无法弄清原因

  

无法转换类型的对象       '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();

如果子类列表未完成,则不确定如何重构元素列表。

3 个答案:

答案 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 ,因此从AnimalCat的转换会使您迷失方向Animal拥有的成员,并且仅与Cat的成员保持联系(除非您再次投射,但这无关紧要...)

P.S。我最近一直在用另一种语言进行编码,所以请原谅我对变量的命名和代码格式