C#4.0 Dynamic vs Expando ......它们适合哪里?

Per*_*der 49 dynamic-keyword expandoobject dynamicobject c#-4.0

我正在尝试学习C#4.0附带的所有新东西.我无法理解DynamicObjectExpandoObject类型之间的差异.它似乎DynamicObject用于例如当您想要从Python脚本访问变量以及ExpandoObject与COM/Office对象交谈时.我对吗?它们的用途有何不同?

Pau*_*sik 90

Expando 是一种 dynamic可以在运行时添加(或删除)成员类型.dynamic旨在允许.NET在与动态类型语言(如Python和JavaScript)连接时与类型进行互操作.

因此,如果需要处理动态类型:使用dynamic并且如果需要处理动态数据(如XML或JSON):使用ExpandoObject

expando的声明显示了dynamic和expando之间的关系:

dynamic expando = new ExpandoObject();
Run Code Online (Sandbox Code Playgroud)

并且能够添加新属性:

expando.SomeNewStringVal = "Hello World!";
Run Code Online (Sandbox Code Playgroud)

最后一行代码在expando对象中创建了一个全新的字符串属性SomeNewStringVal.字符串类型是从赋值中推断出来的.

因此,expando是一种动态数据类型,可以表示动态变化的数据.简而言之就是这样.这是对动态和expando的深入了解.

完整的例子:

using System;
using System.Dynamic;

class Program
{
    static void Main(string[] args)
    {
        dynamic expando = new ExpandoObject();
        expando.SomeNewStringVal = "Hello Brave New Whirrled!";
        Console.WriteLine(expando.SomeNewStringVal);

        // more expando coolness/weirdness:
        var p = expando as IDictionary<String, object>;
        p["A"] = "New val 1";
        p["B"] = "New val 2";

        Console.WriteLine(expando.A);
        Console.WriteLine(expando.B);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然他接受了它,但我认为OP意味着DynamicObject和ExpandoObject之间存在差异. (7认同)
  • [`DynamicObject`](https://learn.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.7) 未得到解决。MSDN:*提供用于指定运行时动态行为的基类。该类必须继承自;您不能直接实例化它。* MSDN 页面包含基于“DynamicObject”的简化“ExpandoObject”实现。因此,这两种类型都用于后期绑定,但是“ExpandoObject”是具体的(并且是密封的),而“DynamicObject”只是自定义动态对象的基类。 (2认同)