为什么我不能索引到ExpandoObject?

Ric*_*ban 34 c# dynamic expandoobject

今天在研究C#动态时,有些东西让我感到惊讶(我从未使用过它们,但最近我一直在试验Nancy web框架).我发现我不能这样做:

dynamic expando = new ExpandoObject();

expando.name = "John";

Console.WriteLine(expando["name"]);
Run Code Online (Sandbox Code Playgroud)

最后一行抛出异常:

无法将[]索引应用于"System.Dynamic.ExpandoObject"类型的表达式

我理解错误信息,但我不明白为什么会这样.我查看了ExpandoObject的文档,它显式实现IDictionary<,>,因此有一个this.[index]方法(MSDN).为什么我不能打电话给它?

当然,没有什么可以阻止我ExpandoObject手动向下翻译到字典然后索引到它,但这种方式无视这一点; 它也没有解释Expando如何能够隐藏其中一个接口的方法.

这里发生了什么?

Cod*_*ter 50

Expando如何能够隐藏其中一个接口的方法.

因为正如您在文档中正确发现的那样,索引器是一个显式的接口实现.从显式接口实现教程:

实现接口的类可以显式实现该接口的成员.显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问它.

这意味着您必须将引用转换为接口才能访问它:

((IDictionary<String, Object>)expando)["name"]
Run Code Online (Sandbox Code Playgroud)

  • 这似乎打败了甚至使用ExpandoObject的目的.也可以将其声明为字典. (9认同)
  • @Triynko 我很惊讶你的评论有这么多人喜欢。在这种情况下,ExpandoObject 既可以用作 `dynamic` 也可以用作 `Dictionary`,您可以动态分配一个字段 `exp.MyField = 3` 并将其读取为字典值 `((IDictionary&lt;String, Object&gt;)exp)[" MyField"]` 或反之亦然。我的项目中有一种情况只能使用 ExpandoObjects 来解决。 (2认同)