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)