2010-08-22 4 views
43

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

+2

Лучшие ответы здесь: http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic –

ответ

86

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

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

провозглашению EXPANDO показывает зависимость между динамическим и в EXPANDO :

dynamic expando = new ExpandoObject(); 

А возможность добавления нового свойства:

expando.SomeNewStringVal = "Hello World!"; 

Это последняя строка кода создает совершенно новую строку про perty в объекте expando, который называется SomeNewStringVal. Тип строки выводится из назначения.

Так что expando - это динамический тип данных, который может представлять динамически изменяющиеся данные. Это все в двух словах. Here's a deeper look at dynamic and 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); 
    } 
} 
+5

Хотя он принял это, я думаю, что OP означало разницу между DynamicObject и ExpandoObject. – nawfal

+1

Просто отметить, что это пригодится вовремя в реальном мире. Я просто использовал его API для создания объектов ответа на dyanmic до сериализации в xml или json. Таким образом, я могу рекурсивно добавлять подклассы с отдельными именами свойств без необходимости определять тонну явных свойств. "GroupsL1": [{"GroupingL2 :: [{... – user2326106

+0

[' DynamicObject'] (https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- 4.7) остался без внимания. MSDN: * Предоставляет базовый класс для указания динамического поведения во время выполнения. Этот класс должен быть унаследован от него, вы не можете его напрямую создать. * Страница MSDN содержит упрощенную реализацию 'ExpandoObject' на основе' DynamicObject' Таким образом, оба типа используются с поздним связыванием, но 'ExpandoObject' является конкретным (и закрытым), а' DynamicObject' является базовым классом для настраиваемых динамических объектов. – Palec

 Смежные вопросы

  • Нет связанных вопросов^_^