640 Stimmen

Was sind die wahren Vorteile von ExpandoObject?

Le site ExpandoObject Klasse, die zu .NET 4 hinzugefügt wurde, ermöglicht es Ihnen, einem Objekt zur Laufzeit beliebige Eigenschaften zuzuweisen.

Gibt es irgendwelche Vorteile gegenüber der Verwendung eines Dictionary<string, object> oder sogar ein Hashtabelle ? Soweit ich weiß, ist dies nichts anderes als eine Hashtabelle, auf die man mit einer etwas prägnanteren Syntax zugreifen kann.

Warum ist das zum Beispiel so?

dynamic obj = new ExpandoObject();
obj.MyInt = 3;
obj.MyString = "Foo";
Console.WriteLine(obj.MyString);

Wirklich besser oder wesentlich anders als:

var obj = new Dictionary<string, object>();
obj["MyInt"] = 3;
obj["MyString"] = "Foo";

Console.WriteLine(obj["MyString"]);

Was real Vorteile durch die Verwendung von ExpandoObject anstelle eines beliebigen Wörterbuchtyps, außer dass es nicht offensichtlich ist, dass Sie einen Typ verwenden, der zur Laufzeit bestimmt wird.

761voto

Alexandra Rusina Punkte 10651

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 .

79voto

itowlson Punkte 72130

Ein Vorteil liegt in den Bindungsszenarien. Datenraster und Eigenschaftsraster werden die dynamischen Eigenschaften über das TypeDescriptor-System aufgreifen. Außerdem versteht die WPF-Datenbindung dynamische Eigenschaften, so dass WPF-Steuerelemente leichter an ein ExpandoObject binden können als an ein Wörterbuch.

Die Interoperabilität mit dynamischen Sprachen, die eher DLR-Eigenschaften als Wörterbucheinträge erwarten, kann in einigen Szenarien ebenfalls eine Rolle spielen.

54voto

bjull Punkte 541

Der eigentliche Vorteil für mich ist die völlig mühelose Datenbindung aus XAML:

public dynamic SomeData { get; set; }

...

SomeData.WhatEver = "Yo Man!";

...

 <TextBlock Text="{Binding SomeData.WhatEver}" />

33voto

Drew Marsh Punkte 32833

Interop mit anderen Sprachen, die auf dem DLR ist der wichtigste Grund, den ich mir vorstellen kann. Man kann ihnen nicht eine Dictionary<string, object> da es sich nicht um ein IDynamicMetaObjectProvider . Ein weiterer zusätzlicher Vorteil ist die Implementierung von INotifyPropertyChanged was bedeutet, dass es in der Datenbindungswelt von WPF auch zusätzliche Vorteile hat, die über das hinausgehen, was Dictionary<K,V> kann Ihnen das bieten.

21voto

ChaosPandion Punkte 75527

Es geht nur um die Bequemlichkeit der Programmierer. Ich kann mir vorstellen, mit diesem Objekt schnelle und schmutzige Programme zu schreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X