C# 动态变量不接受没有类型转换的继承属性
我有一个动态变量,通过它序列化json字符串C# 动态变量不接受没有类型转换的继承属性,c#,C#,我有一个动态变量,通过它序列化json字符串 dynamic result = serializer.Deserialize<dynamic>(json); 然后我得到了错误 “System.Collections.Generic.Dictionary”不包含“First”的定义 (但它确实如此,对LINQ来说,是吗?) KeyValuePair<string, object> temp = ((Dictionary<string, object>
dynamic result = serializer.Deserialize<dynamic>(json);
然后我得到了错误
“System.Collections.Generic.Dictionary”不包含“First”的定义
(但它确实如此,对LINQ来说,是吗?)
KeyValuePair<string, object> temp =
((Dictionary<string, object>)result["success"]).First();
这也运行没有任何故障,它让我困惑,因此这篇文章
我所理解的是,动态解析的变量只接受本机属性,需要对继承的属性进行类型转换
我的怀疑是
First()
的IEnumerable
上有一个扩展方法,但是不能以“正常”方式对动态
值调用扩展方法
但是,您可以将其用作常规静态方法:
KeyValuePair<string, object> temp = Enumerable.First(result["success"]);
KeyValuePair temp=Enumerable.First(结果[“成功]);
请注意,这仍然是动态绑定的,而当您强制转换result[“success”]
时,在强制转换之后,所有内容都是静态键入的
但对林克来说确实如此,对吗
不,没有。在First()
的IEnumerable
上有一个扩展方法,但是不能以“正常”方式对动态
值调用扩展方法
但是,您可以将其用作常规静态方法:
KeyValuePair<string, object> temp = Enumerable.First(result["success"]);
KeyValuePair temp=Enumerable.First(结果[“成功]);
请注意,这仍然是动态绑定的,而当您强制转换结果[“success”]
,在强制转换之后,所有内容都是静态类型的。这是因为扩展方法是语法糖。当您在这样的字典上首先调用时:
dictionary.First();
编译器将其转换为:
Enumerable.First(dictionary);
但在这种情况下,由于类型是动态的
,编译器对第一个
一无所知。或者换句话说,它不会检查是否有名为第一个
的扩展方法,并尝试将代码转换为正常的方法调用。在运行时,它会查找实例方法。由于type没有任何名为First
的实例方法,因此会出现异常。要解决这个问题,您只需要将您的方法作为普通方法调用,而不是像Jon Skeet的回答中所述的扩展。这是因为扩展方法是语法糖。当您在这样的字典上首先调用时:
dictionary.First();
编译器将其转换为:
Enumerable.First(dictionary);
但在这种情况下,由于类型是动态的
,编译器对第一个
一无所知。或者换句话说,它不会检查是否有名为第一个
的扩展方法,并尝试将代码转换为正常的方法调用。在运行时,它会查找实例方法。由于type没有任何名为First
的实例方法,因此会出现异常。要解决这个问题,您只需将您的方法作为普通调用,而不是像Jon Skeet的回答中所述的扩展。谢谢Jon,有您在身边总是一件愉快的事。谢谢Jon,有您在身边总是一件愉快的事。