我正试图在后台使用WebPages,使用WebMatrix来模拟一个页面。我已经为其中一个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"]
强制转换为所需类型的数组。然而,这不能用于匿名类型,因为您没有其类型的句柄,因此无法强制转换它
一旦将new[] { ... }
存储在动态类型的PageData
中,就丢失了对匿名类型的所有编译时引用。因此,尝试在其上使用特定类型的LINQ运算符是不可行的。
正如我在评论中提到的,正确的解决方案是始终使用强类型模型。您不应该依赖于在视图中声明和定义的匿名类型来模拟页面。让页面依赖于一个真实的模型,并填充该模型并将其提供给页面。