2008-09-22 11 views
10
erstellen

Gibt es eine Möglichkeit, C# 3.0 anonymes Objekt über Reflection zur Laufzeit in .NET 3.5 zu erstellen? Ich möchte sie in meinem Serialisierungsschema unterstützen, also muss ich sie programmgesteuert manipulieren.Anonyme Objekte von Reflection in C#

später den Anwendungsfall

Eine zusätzliche Einschränkung ist zu klären, bearbeitet, dass ich all das in einem Silverlight-Anwendung wird ausgeführt, so sind zusätzliche Laufzeiten keine Option, und nicht sicher, wie auf der Codegenerierung Fliege wird funktionieren.

Antwort

3

Hier ist ein anderer Weg, scheint direkter.

object anon = Activator.CreateInstance(existingObject.GetType()); 
+0

..... Ja, oder das. – TraumaPony

+0

Was ist, wenn Sie einen Typ erstellen möchten, der nicht mit dem vorhandenen Objekt identisch ist? –

+0

@ AlexHopeO'Connor: 'CreateInstance' nimmt ein' Type' Objekt, so dass Sie es jedem 'Type' übergeben können. Zum Beispiel 'Activator.CreateInstance (typeof (string))'. – Guvante

1

Verwenden Sie Reflektion, um den Typ abzurufen, verwenden Sie GetConstructor für den Typ, verwenden Sie Invoke für den Konstruktor.

Edit: Dank Sklivvz für den Hinweis auf, dass ich eine Frage beantwortet, die nicht gestellt wurde;)

Die Antwort auf die eigentliche Frage: Ich habe festgestellt, dass C# -Code zu erzeugen und dann CodeDomProvider mit (aber nicht CodeDOM selbst - schrecklich) und dann das Kompilieren dieser nach unten gerichteten und reflektierenden Typen ist der einfachste Weg, 'anonyme' Objekte zur Laufzeit zu machen.

+0

Ich glaube, er bedeutet: wenn der Typ nicht – Sklivvz

+0

Dank deklariert wird, dies machbar klingt ... Allerdings wird, dass die Arbeit für eine Silverlight-Anwendung? Nicht sicher, ob CodeDOM-Dateien dort verfügbar sind. –

1

Vielleicht möchten Sie in das DLR schauen. Ich habe es selbst (noch) nicht selbst gemacht, aber der Anwendungsfall für das DLR (dynamische Sprachen) klingt sehr nach dem, was Sie versuchen zu tun.

Je nachdem, was Sie tun möchten, könnte das dynamische Proxy-Objekt des Castle-Frameworks auch gut passen.

+0

Danke, klingt interessant. Aber wahrscheinlich ein No-Go für mich, wie ich es in einer Silverlight App verwenden möchte. –

3

Ja, da ist. Aus dem Gedächtnis:

public static T create<T>(T t) 
{ 
    return Activator.CreateInstance<T>(); 
} 

object anon = create(existingAnonymousType); 
+0

Danke, das sieht wie der einzige einfache Weg aus .. Nicht eine sehr einfache Sache zu tun, obwohl. –

+0

Zurückblickend, wird dies einfach in den Compilierzeittyp von existingAnisonyType eingebunden, nicht in den Laufzeittyp, da der syntaktische Zucker des Weglassens des generischen Parameters ein Kompilierzeitartefakt ist.Anders ausgedrückt, wenn es als Objekt definiert ist, erstellen Sie eine Instanz des Objekts. – Guvante

1

Sie Reflection.Emit verwenden können, um die erforderlichen Klassen dynamisch zu erzeugen, obwohl es ziemlich böse ist bis zu kodieren.

Wenn Sie sich für diese Route entscheiden, würde ich empfehlen, die Reflection Emit Language Addin für .NET Reflector herunterzuladen, da Sie sehen können, wie vorhandene Klassen mit Reflection.Emit erstellt werden, daher eine gute Methode zum Erlernen dieser Ecke des Frameworks.

+0

Danke, das ist machbar, aber es wird wahrscheinlich nicht mit bestehenden anonymen Klassen zusammenarbeiten, glaube ich. –

1

Sie könnten auch einen Blick in die FormatterServices Klasse haben wollen: MSDN entry on FormatterServices

Es enthält GetSafeUninitializedObject, die eine leere Instanz der Klasse erstellen, und mehrere andere praktische Methoden, wenn die Serialisierung zu tun.

Als Antwort auf den Kommentar von Michael: Wenn Sie die Typ-Instanz für Typ T nicht haben, können Sie es immer von Typeof (T) erhalten. Wenn Sie ein Objekt eines unbekannten Typs haben, können Sie GetType() aufrufen, um die Type-Instanz zu erhalten.

+0

Das Problem damit ist, dass ich keine Typ-Instanz habe. Aber danke für den Tipp, lohnt sich trotzdem anzuschauen. –

+0

Ja, die GetType-Sache macht Sinn. Es sieht so aus, als müsste ich nur ein Beispiel für jedes Objekt erstellen und sie später kopieren. –