Каковы истинные преимущества ExpandoObject?

558
задан Luke Girvin 6 February 2019 в 16:11
поделиться

5 ответов

Поскольку я написал статью MSDN, на которую вы ссылаетесь, я думаю, что должен ответить на этот вопрос.

Во-первых, я ожидал этого вопроса, и поэтому я написал сообщение в блоге, которое показывает более или менее реальный вариант использования ExpandoObject: Динамический в C # 4.0: Знакомство с ExpandoObject .

Вкратце, ExpandoObject может помочь вам создавать сложные иерархические объекты. Например, представьте, что у вас есть словарь внутри словаря:

Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);

Чем глубже иерархия, тем уродливее код. С ExpandoObject он остается элегантным и читаемым.

dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);

Во-вторых, как уже было указано, ExpandoObject реализует интерфейс INotifyPropertyChanged, который дает вам больше контроля над свойствами, чем словарь.

Наконец, вы можете добавлять события в ExpandoObject, как здесь:

class Program
{
   static void Main(string[] args)
   {
       dynamic d = new ExpandoObject();

       // Initialize the event to null (meaning no handlers)
       d.MyEvent = null;

       // Add some handlers
       d.MyEvent += new EventHandler(OnMyEvent);
       d.MyEvent += new EventHandler(OnMyEvent2);

       // Fire the event
       EventHandler e = d.MyEvent;

       if (e != null)
       {
           e(d, new EventArgs());
       }

       // We could also fire it with...
       //      d.MyEvent(d, new EventArgs());

       // ...if we knew for sure that the event is non-null.
   }

   static void OnMyEvent(object sender, EventArgs e)
   {
       Console.WriteLine("OnMyEvent fired by: {0}", sender);
   }

   static void OnMyEvent2(object sender, EventArgs e)
   {
       Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
   }
}
675
ответ дан 22 November 2019 в 22:09
поделиться

Одно из преимуществ - сценарии привязки. Сетки данных и сетки свойств будут получать динамические свойства через систему TypeDescriptor. Кроме того, привязка данных WPF будет понимать динамические свойства, поэтому элементы управления WPF могут быть привязаны к ExpandoObject более легко, чем к словарю.

Взаимодействие с динамическими языками, которые будут ожидать свойства DLR, а не словарные статьи, также может быть рассмотрено в некоторые сценарии.

74
ответ дан 22 November 2019 в 22:09
поделиться

Взаимодействие с другими языками, основанное на DLR , - это причина №1, о которой я могу думать. Вы не можете передать им Dictionary , так как это не IDynamicMetaObjectProvider . Еще одним дополнительным преимуществом является то, что он реализует INotifyPropertyChanged , что означает, что в мире привязки данных WPF он также имеет дополнительные преимущества помимо того, что может предоставить вам Dictionary .

28
ответ дан 22 November 2019 в 22:09
поделиться

Все дело в удобстве программиста. Я могу представить, как писать быстрые и грязные программы с этим объектом.

19
ответ дан 22 November 2019 в 22:09
поделиться

Я думаю, что это будет иметь синтаксическое преимущество, поскольку вы больше не будете «подделывать» динамически добавляемые свойства с помощью словаря.

Это, а также взаимодействие с динамическими языками, я бы подумал. .

14
ответ дан 22 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: