Я пытаюсь изучить все новые лакомства, которые поставляются с C# 4.0. Я не понимаю различия между типами DynamicObject
и ExpandoObject
. Кажется, что используется DynamicObject
, например. когда вы хотите получить доступ к переменным из сценариев Python и ExpandoObject
при разговоре с объектами COM/Office. Я прав? В чем разница в их использовании?C# 4.0 Dynamic vs Expando ... где они подходят?
ответ
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);
}
}
Хотя он принял это, я думаю, что OP означало разницу между DynamicObject и ExpandoObject. – nawfal
Просто отметить, что это пригодится вовремя в реальном мире. Я просто использовал его API для создания объектов ответа на dyanmic до сериализации в xml или json. Таким образом, я могу рекурсивно добавлять подклассы с отдельными именами свойств без необходимости определять тонну явных свойств. "GroupsL1": [{"GroupingL2 :: [{... – user2326106
[' DynamicObject'] (https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- 4.7) остался без внимания. MSDN: * Предоставляет базовый класс для указания динамического поведения во время выполнения. Этот класс должен быть унаследован от него, вы не можете его напрямую создать. * Страница MSDN содержит упрощенную реализацию 'ExpandoObject' на основе' DynamicObject' Таким образом, оба типа используются с поздним связыванием, но 'ExpandoObject' является конкретным (и закрытым), а' DynamicObject' является базовым классом для настраиваемых динамических объектов. – Palec
Лучшие ответы здесь: http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic –