Я пытаюсь изучить все новые возможности C # 4.0. Я не понимаю различий между типами DynamicObject
и ExpandoObject
. Похоже, что используется DynamicObject
, например. когда вы хотите получить доступ к переменным из сценариев Python и ExpandoObject
при разговоре с объектами COM / Office. Я прав? В чем разница в их использовании?
Где они подходят? C # 4.0 Dynamic vs Expando?
Ответы (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);
}
}
DynamicObject
оставлен без внимания . MSDN: Предоставляет базовый класс для определения динамического поведения во время выполнения. Этот класс должен быть унаследован от; вы не можете создать его экземпляр напрямую. Страница MSDN содержит упрощенную ExpandoObject
реализацию, основанную на DynamicObject
. Итак, оба типа используются с поздним связыванием, но ExpandoObject
является конкретным (и запечатанным), а DynamicObject
- просто базовым классом для настраиваемых динамических объектов.
- person Palec; 26.08.2017