Da ich den MSDN-Artikel geschrieben habe, auf den Sie sich beziehen, muss ich diesen wohl beantworten.
Zuerst habe ich diese Frage vorweggenommen und deshalb einen Blog-Beitrag geschrieben, der einen mehr oder weniger realen Anwendungsfall für ExpandoObject: Dynamic in C # 4.0: Einführung des ExpandoObject zeigt .
In Kürze kann ExpandoObject Ihnen beim Erstellen komplexer hierarchischer Objekte helfen. Stellen Sie sich zum Beispiel vor, Sie haben ein Wörterbuch in einem Wörterbuch:
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"]);
Je tiefer die Hierarchie ist, desto hässlicher ist der Code. Mit ExpandoObject bleibt es elegant und lesbar.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
Zweitens implementiert ExpandoObject, wie bereits erwähnt, die INotifyPropertyChanged-Schnittstelle, mit der Sie mehr Kontrolle über Eigenschaften haben als mit einem Wörterbuch.
Schließlich können Sie ExpandoObject wie folgt Ereignisse hinzufügen:
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);
}
}
Denken Sie auch daran, dass Sie nichts daran hindert, Ereignisargumente dynamisch zu akzeptieren. Mit anderen Worten, anstatt zu verwenden EventHandler
, können Sie verwenden, EventHandler<dynamic>
was dazu führen würde, dass das zweite Argument des Handlers lautet dynamic
.