繁体   English   中英

在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]无法转换为sidc.Framework.Web.Helpers.ProjectList类型。

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

您不能将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())

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

这就是继承的工作方式-您可以将ProjectListList<Project> ,但不能相反List<Project>的类型不是ProjectList

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM