尝试强制转换匿名对象时出错,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表达式部分
  • 无法在动态值上调用扩展方法( 作为扩展方法)。 这会影响SelectToList方法。

您可以通过强制转换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();