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
实例,如您在第二个示例中所示。
我正在编写一个 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
实例,如您在第二个示例中所示。