[asp.net-mvc]动态对象的奇怪行为

发布时间: 2017/3/25 18:52:19
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个简单的控制方法 DoSomething ,接收 json 字符串,将它转换为一个动态的对象并试图获取数据︰

[HttpPost]
public string DoSomething(string jsonStr)  // {"0":null,"1":"loadData"}
{
     // In this case obj.GetType() = System.Web.Helpers.DynamicJsonObject
     object obj = Json.Decode(jsonStr); 

     // Correct, a == "loadData"
     var a = (obj as dynamic)["1"];          

     // Incorrect, compilation exception:
     // "Cannot apply indexing with [] to an expression 
     // of type 'System.Web.Helpers.DynamicJsonObject'"
     var b = (obj as DynamicJsonObject)["1"] 

     return "OK"; 
}

我的问题是为什么它是可能访问索引器时当原始类型没有索引器当时作为一个动态的对象使用的对象吗?

Watches window

解决方法 1:

在第一种情况下,你正在使用的所有基础设施 dynamic -这不只是使用反射来查找"真实"的成员,但也使用 IDynamicMetaObjectProvider 为成员,只是在执行时提供支持。这样做是因为当你使用 dynamic ,绑定 (工作成员的名称是什么意思) 的过程在编译时执行的执行时间而不是在。

在这种情况下,它是索引器是被用在执行时间- DynamicJsonObject 不声明索引器,但重写 TryGetIndex 方法的 DynamicObject 。元对象提供程序实现的 DynamicObject 将路由通过索引器"get"呼叫 TryGetIndex

一个简单的例子是 ExpandoObject :

ExpandoObject foo = new ExpandoObject();
// This is invalid; the compiler can't find a Property member
foo.Property = "broken";

dynamic bar = foo;
// This is fine; binding is performed at execution time.
bar.Property = "working";
赞助商