在ASP.NET WebPages中使用带有匿名类的LINQ和隐式类型化数组时出错

我正在尝试使用WebPatrix使用WebPages来模拟页面。 我已经为其中一个PageData键分配了一个隐式类型的匿名对象,但是当我尝试在集合上使用LINQ方法时,我收到以下错误:

CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

以下是一些示例代码:

 @{ PageData["Vals"] = new [] { new { ID=1, Quantity=5 }, new { ID=2, Quantity=3 } }; var sum = PageData["Vals"].Sum(x => x.Quantity); } 

如果我首先将数组存储在常规对象中,我可以使用它上面的LINQ方法。 当它作为一个动态对象从PageData出来时似乎有一个问题 – 但我似乎无法弄清楚将它强制回初始类型的秘诀。

这个问题的一般解决方案是明确地转换它。 PageData["Vals"]表达式PageData["Vals"]转换为您期望的类型的数组。 但是,这不适用于匿名类型,因为您没有其类型的句柄,因此无法强制转换它。

一旦将new[] { ... }存储在动态类型的PageData ,就会丢失对匿名类型的所有编译时引用。 因此,尝试在其上使用特定于类型的LINQ运算符是不可能的。

正如我在评论中提到的,正确的解决方案是始终使用强类型模型。 您不应该依赖在视图中声明和定义的匿名类型来模拟页面。 让页面依赖于真实模型并填充该模型并将其提供给页面。