C# 动态变量不接受没有类型转换的继承属性

C# 动态变量不接受没有类型转换的继承属性,c#,C#,我有一个动态变量,通过它序列化json字符串 dynamic result = serializer.Deserialize<dynamic>(json); 然后我得到了错误 “System.Collections.Generic.Dictionary”不包含“First”的定义 (但它确实如此,对LINQ来说,是吗?) KeyValuePair<string, object> temp = ((Dictionary<string, object>

我有一个动态变量,通过它序列化json字符串

dynamic result = serializer.Deserialize<dynamic>(json);
然后我得到了错误

“System.Collections.Generic.Dictionary”不包含“First”的定义

(但它确实如此,对LINQ来说,是吗?)

KeyValuePair<string, object> temp = 
    ((Dictionary<string, object>)result["success"]).First();
这也运行没有任何故障,它让我困惑,因此这篇文章

我所理解的是,动态解析的变量只接受本机属性,需要对继承的属性进行类型转换

我的怀疑是

  • 我的理解正确吗
  • 这是预期的行为吗
  • 若然,原因为何
  • 附言:用C#4.0编写代码

    但对林克来说确实如此,对吗

    不,没有。在
    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,有您在身边总是一件愉快的事。