尝试强制转换匿名对象时出错,Razor
我正在尝试强制转换一组匿名对象,其中每个对象如下所示:
new {type="internal",title="Linktitle",target="_blank",link="http://www.google.se"}
我已经声明了一个类“链接”,应该对其进行匿名对象的转换
class Link{ public string type {get;set;} public string target {get;set;} public string title {get;set;} public string link {get;set;} }
现在我试图像这样投射物体
List links = Model.relatedLinks.Select(l => new Link{type=l.type,target=l.target,title=l.title,link=l.link}).ToList();
然后我得到了错误
Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type
我找到了关于如何投射匿名对象的这个页面,但我也是这样做的。 或者我错过了什么?
如果relatedLinks
本身是动态值,那么你有两个问题:
- 已报告lambda表达式部分
- 无法在动态值上调用扩展方法( 作为扩展方法)。 这会影响
Select
和ToList
方法。
您可以通过强制转换lambda表达式来解决第一个问题。 您可以通过直接调用Enumerable.Select
来绕过第二个工作:
// Note: don't use var here. We need the implicit conversion from // dynamic IEnumerable query = Enumerable.Select(Model.relatedLinks, (Func) (l => new Link { type = l.type, target = l.target, title = l.title, link = l.link } ); var links = query.ToList();
或者为了格式化:
Func projection = l => new Link { type = l.type, target = l.target, title = l.title, link = l.link }; IEnumerable query = Enumerable.Select(Model.relatedLinks, projection); var links = query.ToList();
如果Model.relatedLinks
已经是IEnumerable
(或类似的东西),那么你可以调用Select
作为扩展方法 – 但你仍然需要一个强类型的委托。 例如,后一版本将成为:
Func projection = l => new Link { type = l.type, target = l.target, title = l.title, link = l.link }; IEnumerable query = Model.relatedLinks.Select(projection); var links = query.ToList();