Поскольку я написал статью 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);
}
}
Одно из преимуществ - сценарии привязки. Сетки данных и сетки свойств будут получать динамические свойства через систему TypeDescriptor. Кроме того, привязка данных WPF будет понимать динамические свойства, поэтому элементы управления WPF могут быть привязаны к ExpandoObject более легко, чем к словарю.
Взаимодействие с динамическими языками, которые будут ожидать свойства DLR, а не словарные статьи, также может быть рассмотрено в некоторые сценарии.
Взаимодействие с другими языками, основанное на DLR
, - это причина №1, о которой я могу думать. Вы не можете передать им Dictionary
, так как это не IDynamicMetaObjectProvider
. Еще одним дополнительным преимуществом является то, что он реализует INotifyPropertyChanged
, что означает, что в мире привязки данных WPF он также имеет дополнительные преимущества помимо того, что может предоставить вам Dictionary
.
Все дело в удобстве программиста. Я могу представить, как писать быстрые и грязные программы с этим объектом.
Я думаю, что это будет иметь синтаксическое преимущество, поскольку вы больше не будете «подделывать» динамически добавляемые свойства с помощью словаря.
Это, а также взаимодействие с динамическими языками, я бы подумал. .