ExpandoObject 不包含 "ContainsKey"?

ExpandoObject doesn't contain "ContainsKey"?

我正在编写一个 MVC 应用程序,并封装了通过 Action Filter 获取和传递一系列设置到我的视图。我可以证明这在调试器中工作正常。我可以直接打属性。但是,由于设置是 database-backed,我希望能够在我离开之前测试设置是否存在,并期望相关属性附加到对象。我得到以下信息:

'System.Dynamic.ExpandoObject' does not contain a definition for 'ContainsKey'

也在查看 MSDN documentation, it most certainly does or at least should. My use-case also seems to fit its intended usage。因此,据我所知,我没有用这种方法做任何事情 "weird"。我在调试器中看到的一些屏幕截图:

即使 QuickWatch window 看到了一个对象的设置,我还是回去检查并肯定自己将其声明为 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);
    }
}

所有代码运行良好,没有抛出异常。关于这里发生的事情有什么想法吗?

ExpandoObject 提供 ContainsKey 的实现 * 作为 IDictionary 的显式接口实现。也就是说只有变量是接口类型的时候才能访问方法

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