在 lambda 表达式中转换对象

Cast object in lambda expression

我正在尝试将一个列表投射到我的自定义列表,即 ProjectList

IList<Project> projects = cm.GetOrAdd("projectList", () => (ProjectList)ProjectService.GetAllProjects().ToList(), new CacheItemPolicy(5));

ProjectList 仅包含:

public class ProjectList : List<Project>
{
    public override string ToString()
    {
        return string.Format("Projects: {0}", this.Count());
    }
}

但是它给出了一个无法转换对象的运行时错误。

错误:

System.Collections.Generic.List`1[sidc.Framework.Data.Entities.Project] can't be converted to type sidc.Framework.Web.Helpers.ProjectList.

我在监督什么吗?我正在使用 lambda,因为当对象不在缓存中时,我的 cm (CacheManager) 将评估 Func<>

您不能将 List<T> 向下转型为任何继承自 List<T> 的类型,因为运行时无法为您填补空白。它不知道如何从 "Animal" 创建 "Dog"。这就是编译器试图告诉你的。

添加一个构造函数,它接受 Project 的可枚举,并用该列表填充自身:

public class ProjectList : List<Project>
{
    public ProjectList() { }
    public ProjectList(IEnumerable<Project> projects)
        : this()
    {
        this.AddRange(projects);
    }

    public override string ToString()
    {
        return string.Format("Projects: {0}", this.Count());
    }
}

然后将您的 lambda 更改为:

() => (ProjectList)ProjectService.GetAllProjects().ToList() 

收件人:

() => new ProjectList(ProjectService.GetAllProjects())

但是通过引入一个具体类型(ProjectList 代表 List<Project>),您几乎可以消除泛型的使用:不必为每个记录类型指定一个类型。您可能根本不需要 ProjectList

这就是继承的工作原理 - 您可以将 ProjectList 转换为 List<Project>,但不能反过来 - List<Project> 不是 ProjectList[=14 类型=]