0

我正在尝试使用引擎盖下的 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 出来时似乎存在问题 - 但我似乎无法弄清楚将其强制恢复为初始类型的秘诀。

4

1 回答 1

2

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

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

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

于 2011-06-06T18:20:55.807 回答