Da ich den MSDN-Artikel, auf den Sie sich beziehen, verfasst habe, muss ich diese Frage wohl beantworten.
Zunächst einmal habe ich diese Frage vorausgesehen und deshalb einen Blogbeitrag geschrieben, der einen mehr oder weniger realen Anwendungsfall für ExpandoObject zeigt: Dynamisch in C# 4.0: Einführung des ExpandoObjects .
Kurz gesagt, ExpandoObject kann Ihnen helfen, komplexe hierarchische Objekte zu erstellen. Stellen Sie sich zum Beispiel vor, dass Sie ein Wörterbuch innerhalb eines Wörterbuchs haben:
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, desto hässlicher der Code. Mit ExpandoObject bleibt er elegant und lesbar.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
Zweitens, wie bereits erwähnt, implementiert ExpandoObject die Schnittstelle INotifyPropertyChanged, die Ihnen mehr Kontrolle über die Eigenschaften gibt als ein Wörterbuch.
Schließlich können Sie wie hier Ereignisse zu ExpandoObject 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 nichts Sie daran hindert, Ereignisargumente auf dynamische Weise zu akzeptieren. Mit anderen Worten, statt der Verwendung von EventHandler
können Sie verwenden EventHandler<dynamic>
was dazu führen würde, dass das zweite Argument des Handlers dynamic
.