我正在编写一个MVC应用程序,并通过Action Filter封装并将一系列设置传递给我的视图。我可以证明这在调试器中工作正常。我可以直接点击属性。但是,由于设置是数据库支持的,我希望能够在我离开之前测试设置是否存在并期望将相关属性附加到对象。我得到以下内容:
'System.Dynamic.ExpandoObject'不包含'ContainsKey'的定义
看MSDN documentation,肯定会或至少应该这样做。我的用例似乎也适合its intended usage。所以,就我所知,我并没有采用这种方法做任何“怪异”的事情。我在调试器中看到的一些屏幕截图:
即使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);
}
}
所有代码都运行正常,没有抛出异常。关于这里发生了什么的任何想法?
答案 0 :(得分:2)
ExpandoObject
为ContainsKey
*提供了一个实现,作为IDictionary
的显式接口实现。这意味着只有当变量属于接口类型时才能访问该方法。
因此,要调用ContainsKey
,您需要通过ExpandoObject
类型的变量访问IDictionary
实例,如第二个示例中所示。