Dynamische Elemente zu einem dynamischen Objekt hinzufügen

8

Ich suche nach einer Möglichkeit, Mitglieder dynamisch zu einem dynamischen Objekt hinzuzufügen. OK, ich denke, ein wenig Klärung ist notwendig ...

Wenn Sie das tun:

%Vor%

Die Eigenschaft Bar wird zur Laufzeit dynamisch hinzugefügt. Aber der Code bezieht sich immer noch "statisch" auf Bar (der Name "Bar" ist fest codiert) ... Was, wenn ich eine Eigenschaft zur Laufzeit hinzufügen möchte, ohne ihren Namen zur Kompilierzeit zu kennen?

Ich weiß, wie man das mit einem benutzerdefinierten dynamischen Objekt macht (eigentlich vor einigen Monaten darüber gebloggt , mit den Methoden der DynamicObject -Klasse, aber wie kann ich es mit jedem dynamischen Objekt machen?

>

Ich könnte wahrscheinlich die IDynamicMetaObjectProvider -Schnittstelle benutzen, aber ich verstehe nicht, wie man sie benutzt. Welches Argument sollte ich beispielsweise an die Methode GetMetaObject übergeben? (Es erwartet ein Expression )

Und wie machen Sie übrigens Reflektionen über dynamische Objekte? "Reguläre" Reflektion und TypeDescriptor zeigen die dynamischen Member nicht an ...

Jede Einsicht wäre willkommen!

    
Thomas Levesque 17.01.2010, 03:34
quelle

4 Antworten

9

Was Sie wollen, ist ähnlich den getattr / setattr Funktionen von Python. Es gibt keine integrierte Möglichkeit, dies in C # oder VB.NET zu tun. Die äußere Schicht des DLR (die mit IronPython und IronRuby in Microsoft.Scripting.dll ausgeliefert wird) enthält eine Reihe von Hosting-APIs, die eine ObjectOperations-API mit GetMember / SetMember-Methoden enthalten. Sie könnten diese verwenden, aber Sie würden die zusätzliche Abhängigkeit des DLR und einer DLR-basierten Sprache benötigen.

Der wahrscheinlich einfachste Ansatz wäre, eine CallSite mit einem der vorhandenen C # -Binder zu erstellen. Sie können den Code dafür erhalten, indem Sie das Ergebnis von "foo.Bar = 42" in ildasm oder Reflektor betrachten. Aber ein einfaches Beispiel dafür wäre:

%Vor%     
Dino Viehland 17.01.2010, 09:47
quelle
5

ExpandoObject implementiert IDictionary & lt; string, object & gt; wenn auch explizit. Dies bedeutet, dass Sie das ExpandoObject einfach in IDictionary & lt; string, object & gt; und manipuliere das Wörterbuch.

%Vor%     
Uffe Seerup 12.08.2011 22:24
quelle
5

Das Opensource-Framework Dynamite wird dies tun (verfügbar über nugget ). Es kapselt die Cacheseite und den Binder-Code, den @ Dino-Viehland benutzt hat, zwischen.

%Vor%

Es kann auch viele andere Arten von c # -Bindern zu aufrufen.

    
jbtule 06.07.2011 19:49
quelle
1

Ich weiß, das ist ein ziemlich alter Post, aber ich dachte, ich würde Miron Abramson Lösung , wie du deinen eigenen Typ erstellen und Eigenschaften zur Laufzeit hinzufügen kannst - falls jemand anders da ist auf der Suche nach etwas ähnlichem.

    
JoBot 28.03.2012 22:38
quelle