Где они подходят? C # 4.0 Dynamic vs Expando?

Я пытаюсь изучить все новые возможности C # 4.0. Я не понимаю различий между типами DynamicObject и ExpandoObject. Похоже, что используется DynamicObject, например. когда вы хотите получить доступ к переменным из сценариев Python и ExpandoObject при разговоре с объектами COM / Office. Я прав? В чем разница в их использовании?


person Perpetualcoder    schedule 22.08.2010    source источник
comment
Лучшие ответы здесь: stackoverflow.com/questions/ 3565481 /   -  person Brian Low    schedule 02.03.2014


Ответы (1)


Expando - это dynamic тип, члены которого могут быть добавлены (или удалены) во время выполнения. dynamic разработан, чтобы позволить .NET взаимодействовать с типами при взаимодействии с языками динамической типизации, такими как Python и JavaScript.

Итак, если вам нужно обрабатывать динамический тип: используйте dynamic и если вам нужно обрабатывать динамические данные, такие как XML или JSON: используйте ExpandoObject

Объявление расширения показывает взаимосвязь между динамическим и расширяемым объектами:

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);
    }
}
person Paul Sasik    schedule 22.08.2010
comment
Хотя он принял это, я думаю, что OP означал разницу между DynamicObject и ExpandoObject. - person nawfal; 30.07.2015
comment
Просто отметим, что это действительно может пригодиться в реальном мире. Я просто использовал его API для создания объектов динамического ответа перед сериализацией в xml или json. Таким образом, я могу рекурсивно добавлять подклассы с различными именами свойств без необходимости определять тонну явных свойств. ГруппыL1: [{GroupingL2 :: [{... - person mBrice1024; 20.07.2016
comment
DynamicObject оставлен без внимания . MSDN: Предоставляет базовый класс для определения динамического поведения во время выполнения. Этот класс должен быть унаследован от; вы не можете создать его экземпляр напрямую. Страница MSDN содержит упрощенную ExpandoObject реализацию, основанную на DynamicObject. Итак, оба типа используются с поздним связыванием, но ExpandoObject является конкретным (и запечатанным), а DynamicObject - просто базовым классом для настраиваемых динамических объектов. - person Palec; 26.08.2017