在lambda表达式中转换对象

时间:2015-04-20 11:21:25

标签: c# lambda

我试图将List转换为我的自定义列表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]   无法转换为sidc.Framework.Web.Helpers.ProjectList类型。

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

2 个答案:

答案 0 :(得分:3)

您无法将List<T>向下转换为继承自List<T>的任何类型,因为运行时无法为您填充空白。它不知道如何从“动物”创造“狗”。这就是编译器试图告诉你的。

添加一个接受可枚举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的{​​{1}}),你几乎消灭了泛型的使用:不必为每种记录类型指定类型。您可能根本不需要List<Project>

答案 1 :(得分:0)

这就是继承的工作原理 - 您可以将ProjectList转换为List<Project>,而不是另一种方式 - List<Project>不属于ProjectList