在ASP.NET MVC中使用ExpandoObject时出错

时间:2015-01-19 19:43:49

标签: c# expandoobject

我有一个ASP.NET MVC应用程序。我在我的应用中使用ExpandoObject。目前,我的.cshtml文件中有以下块:

foreach (System.Dynamic.ExpandoObject expo in ViewBag.ExpandoObjects)
{
  <div>@filter.GetType().FullName</div>
}  

此代码工作正常。实际上,它会像我期望的那样在屏幕上打印System.Dynamic.ExpandoObject。但是,当我将代码更新为以下内容时,出现错误。

foreach (System.Dynamic.ExpandoObject expo in ViewBag.ExpandoObjects)
{
  foreach (var key in expo.Keys) 
  {
    <div>@key</div>
  }
}                  

错误说:

CS1061: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Keys' and no extension method 'Keys' accepting a first argument of type 'System.Dynamic.ExpandoObject' could be found (are you missing a using directive or an assembly reference?)      

我不明白为什么我收到这个错误。根据文档,有一个Keys property。我错过了什么?

1 个答案:

答案 0 :(得分:3)

Keys接口显式实现了IDictionary属性。例如,这不会编译:

Console.WriteLine(new ExpandoObject().Keys);

如果您想使用Keys,则必须将其转换为IDictionary

foreach (System.Dynamic.ExpandoObject expo in ViewBag.ExpandoObjects)
{
  foreach (var key in ((IDictionary<string, object>)expo).Keys) 
  {
    <div>@key</div>
  }
}  

如果要按编译时知道的名称访问密钥,可以使用字典索引器或将对象强制转换为dynamic

foreach (IDictionary<string, object> expo in ViewBag.ExpandoObjects)
{
    <div>@expo["name"]</div>

foreach (dynamic expo in ViewBag.ExpandoObjects)
{
    <div>@expo.name</div>

这里有一个简短的代码段,可以让您了解如何使用ExpandoObject强制转换为ExpandoObjectdynamicIDictionary<string, object>

var obj = new ExpandoObject();
var dict = ((IDictionary<string, object>)obj);
var dyn = (dynamic) obj;
dyn.name = "Fred";
Console.WriteLine(dyn.name);  // "Fred"
var key = dict.Keys.Single();
Console.WriteLine(key);       // "name"
Console.WriteLine(dict[key]); // "Fred"

请注意,我强烈建议您尽可能使用强类型视图模型。 dynamic打字对于它的制作有利,但如果过度使用会破坏可维护性。