在 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 类型=]
我正在尝试将一个列表投射到我的自定义列表,即 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 类型=]