我正在编写一个MVC应用程序,并通过一个Action过滤器封装一系列设置的获取和传递给我的视图。我可以在调试器中演示这一点。我可以直接撞到这些房产。但是,由于设置是数据库支持的,因此我希望能够在关闭之前测试设置是否存在,并期望相关属性附加到对象。我得到以下信息:
'System.Dynamic.ExpandoObject‘不包含'ContainsKey’的定义
从MSDN文档的角度来看,它肯定会,或者至少应该这么做。我的用例似乎也适合其预定用途。所以,据我所知,我没有用这种方法做任何“奇怪”的事情。我在调试器中看到的一些截图:



尽管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);
}
}所有这些代码都运行良好,没有抛出异常。对这里发生了什么有什么想法吗?
发布于 2015-12-16 22:37:27
ExpandoObject为ContainsKey *提供了一个实现,作为IDictionary的一个显式接口实现。这意味着只有当变量属于接口类型时,才能访问该方法。
因此,要调用ContainsKey,您需要通过一个类型为IDictionary的变量访问ExpandoObject实例,如您在第二个示例中所示。
https://stackoverflow.com/questions/34323191
复制相似问题