我试图将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<>
。
答案 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