Оскільки я написав статтю MSDN, про яку ви посилаєтесь, я, мабуть, маю відповісти на цю.
По-перше, я передбачив це питання, і тому я написав допис у блозі, де показано більш-менш реальний випадок використання для ExpandoObject: Dynamic в 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;
e?.Invoke(d, new EventArgs());
}
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);
}
}
Також пам’ятайте, що ніщо не заважає вам динамічно сприймати аргументи події. Іншими словами, замість використання EventHandler
ви можете використовувати той, EventHandler<dynamic>
який спричинив би другий аргумент обробника dynamic
.