Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 C#4.0动态vs扩展。。。它们适合哪里?_C# 4.0_Expandoobject_Dynamicobject_Dynamic Keyword - Fatal编程技术网

C# 4.0 C#4.0动态vs扩展。。。它们适合哪里?

C# 4.0 C#4.0动态vs扩展。。。它们适合哪里?,c#-4.0,expandoobject,dynamicobject,dynamic-keyword,C# 4.0,Expandoobject,Dynamicobject,Dynamic Keyword,我正在努力学习C#4.0带来的所有新功能。我无法理解DynamicObject和expandooObject类型之间的区别。例如,当您希望从Python脚本访问变量时,以及当与COM/Office对象交谈时,似乎使用了DynamicObject。我说得对吗?它们的用法有什么不同?Expando是一种动态类型,可以在运行时向其添加(或删除)成员dynamic旨在允许.NET在与动态类型语言(如Python和JavaScript)交互时与类型进行互操作 因此,如果需要处理动态类型:使用dynamic

我正在努力学习C#4.0带来的所有新功能。我无法理解
DynamicObject
expandooObject
类型之间的区别。例如,当您希望从Python脚本访问变量时,以及当与COM/Office对象交谈时,似乎使用了
DynamicObject
。我说得对吗?它们的用法有什么不同?

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

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

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

dynamic expando = new ExpandoObject();
以及添加新属性的能力:

expando.SomeNewStringVal = "Hello World!";
最后一行代码在expando对象中创建了一个名为
SomeNewStringVal
的全新字符串属性。字符串类型是从赋值中推断出来的

所以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);
    }
}
使用系统;
运用系统动力学;
班级计划
{
静态void Main(字符串[]参数)
{
动态expando=新的ExpandoObject();
expando.SomeNewStringVal=“你好,勇敢的新呼啸!”;
控制台写入线(expando.SomeNewStringVal);
//更具扩展性的冷静/怪异:
var p=作为索引的expando;
p[“A”]=“新值1”;
p[“B”]=“新值2”;
控制台写入线(expando.A);
控制台写入线(expando.B);
}
}

这里有更好的答案:虽然他已经接受了,但我认为OP意味着DynamicObject和ExpandoObject之间的区别。请注意,这在现实世界中确实很有用。在序列化为xml或json之前,我只是使用它来创建动态响应对象。通过这种方式,我可以递归地添加具有不同属性名称的子类,而无需定义大量显式属性。“GroupsL1:[{”GroupingL2::[{…未寻址。MSDN:提供用于在运行时指定动态行为的基类。此类必须从继承;不能直接实例化。MSDN页面包含基于
DynamicObject
的简化
ExpandoObject
实现。因此,这两种类型都用于后期绑定,但
ExpandoObject
是具体的(并且是密封的),而
DynamicObject
只是自定义动态对象的基类。