繁体   English   中英

ExpandoObject不包含“ ContainsKey”吗?

[英]ExpandoObject doesn't contain “ContainsKey”?

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

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

查看MSDN文档 ,它肯定会或至少应该这样做。 我的用例似乎也符合其预期的用法 因此,据我所知,我对这种方法没有做任何“怪异”的事情。 我在调试器中看到的一些屏幕截图:

调试器报告的类型

直接在设置对象中击中目标属性

尝试以编程方式测试属性是否存在,而不会冒例外风险

即使“快速监视”窗口看到了对象的设置,我还是回过头来检查并确定将其自己​​声明为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实例,如第二个示例所示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM