ExpandoObject不包含“ContainsKey”?

时间:2015-12-16 22:18:38

标签: c# asp.net-mvc .net-4.5

我正在编写一个MVC应用程序,并通过Action Filter封装并将一系列设置传递给我的视图。我可以证明这在调试器中工作正常。我可以直接点击属性。但是,由于设置是数据库支持的,我希望能够在我离开之前测试设置是否存在并期望将相关属性附加到对象。我得到以下内容:

  

'System.Dynamic.ExpandoObject'不包含'ContainsKey'的定义

MSDN documentation,肯定会或至少应该这样做。我的用例似乎也适合its intended usage。所以,就我所知,我并没有采用这种方法做任何“怪异”的事情。我在调试器中看到的一些屏幕截图:

What the debugger reports as the type

Hitting a target property in the settings object directly

Trying to test if the property exists in a programmatic way without risking exceptions

即使QuickWatch窗口看到了对象的设置,我还是回去检查,并且肯定会自己将其声明为ExpandoObject。这是我用来生成和填充此对象的代码。

dynamic bag = filterContext.Controller.ViewBag;

bag.Settings = new ExpandoObject();
IDictionary<string, object> settingsDictionary = (IDictionary<string, object>) bag.Settings;

foreach (KeyValuePair<string, Dictionary<string, string>> pair in settings)
{
    settingsDictionary[pair.Key] = new ExpandoObject();
    IDictionary<string, object> innerDictionary = (IDictionary<string, object>) settingsDictionary[pair.Key];

    foreach (KeyValuePair<string, string> innerValue in pair.Value)
    {
        innerDictionary[innerValue.Key] = JsonConvert.DeserializeObject(innerValue.Value);
    }
}

所有代码都运行正常,没有抛出异常。关于这里发生了什么的任何想法?

1 个答案:

答案 0 :(得分:2)

ExpandoObjectContainsKey *提供了一个实现,作为IDictionary的显式接口实现。这意味着只有当变量属于接口类型时才能访问该方法。

因此,要调用ContainsKey,您需要通过ExpandoObject类型的变量访问IDictionary实例,如第二个示例中所示。