C# ExpandoObject不';“不包含”;“集装箱”吗;?

C# ExpandoObject不';“不包含”;“集装箱”吗;?,c#,asp.net-mvc,.net-4.5,C#,Asp.net Mvc,.net 4.5,我正在编写一个MVC应用程序,并通过一个动作过滤器将一系列设置的获取和传递封装到我的视图中。我可以在调试器中演示这一点。我可以直接点击属性。但是,由于设置是由数据库支持的,因此我希望能够在关闭之前测试设置是否存在,并期望相关属性附加到对象。我得到以下信息: “System.Dynamic.ExpandooObject”不包含“ContainsKey”的定义 从经济的角度来看,它确实是,或者至少应该是这样。我的用例似乎也很适合。所以,据我所知,我并没有用这种方法做任何“奇怪”的事情。我在调试器中看

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

“System.Dynamic.ExpandooObject”不包含“ContainsKey”的定义

从经济的角度来看,它确实是,或者至少应该是这样。我的用例似乎也很适合。所以,据我所知,我并没有用这种方法做任何“奇怪”的事情。我在调试器中看到的一些屏幕截图:

尽管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);
    }
}
dynamic bag=filterContext.Controller.ViewBag;
bag.Settings=新的ExpandooObject();
IDictionary settingsDictionary=(IDictionary)bag.Settings;
foreach(设置中的KeyValuePair对)
{
settingsDictionary[pair.Key]=新的ExpandooObject();
IDictionary innerDictionary=(IDictionary)settingsDictionary[pair.Key];
foreach(pair.Value中的KeyValuePair内部值)
{
innerDictionary[innerValue.Key]=JsonConvert.DeserializeObject(innerValue.Value);
}
}

所有这些代码运行良好,不会引发异常。有什么想法吗?

ExpandoObject
提供了
ContainsKey
*的实现,作为
IDictionary
的显式接口实现。这意味着您只能在变量为接口类型时访问该方法


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

ExpandoObject
ContainsKey
*提供了一个实现,作为
IDictionary
的显式接口实现。这意味着您只能在变量为接口类型时访问该方法


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

对,
ExpandoObject
没有该方法,而
IDictionary
接口没有。仅仅因为它实现了那个接口,并不意味着它必须公开它所实现的成员。@Jeffmerca,这让我很困惑。如何在不使抛出异常成为正常执行结果的情况下进行测试以查看是否存在异常?到目前为止,我的.Net经验告诉我,你不应该这样做,句号。@Bigsby如果你不知道成员在那里,你首先不应该使用
dynamic
。这是该功能的基本前提。如果您实际上不知道对象是否有该成员,则不应该使用它。@Servy这将固有地限制它在COM互操作场景中作为“安全”中介的作用。你并不总是知道那里有什么。@Bigsby,那么你就不应该使用
动态
。它的存在是为了在您确实知道其中的内容时更容易编写代码。如果没有,则需要执行没有
dynamic
时所做的操作。
ExpandoObject
没有该方法,
IDictionary
接口没有该方法。仅仅因为它实现了那个接口,并不意味着它必须公开它所实现的成员。@Jeffmerca,这让我很困惑。如何在不使抛出异常成为正常执行结果的情况下进行测试以查看是否存在异常?到目前为止,我的.Net经验告诉我,你不应该这样做,句号。@Bigsby如果你不知道成员在那里,你首先不应该使用
dynamic
。这是该功能的基本前提。如果您实际上不知道对象是否有该成员,则不应该使用它。@Servy这将固有地限制它在COM互操作场景中作为“安全”中介的作用。你并不总是知道那里有什么。@Bigsby,那么你就不应该使用
动态
。它的存在是为了在您确实知道其中的内容时更容易编写代码。如果你没有,那么你需要做你在没有
dynamic
的情况下会做的事情。不管我喜欢与否,这确实是答案。不管我喜欢与否,这确实是答案。