首页 > 解决方案 > LINQ 查询 ToList() 转换为特定列表时无法转换对象子类

问题描述

我得到一个运行时异常,不知道为什么

无法将“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();

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

标签: c#

解决方案


ToList()返回一个真实的System.Collections.Generic.List实例,而不是你的ElementNameList.

您可以投射ElementNameListIList<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?

推荐阅读