Frage

Gibt es eine Möglichkeit C # 3.0 anonymes Objekt über Reflexion zur Laufzeit in .NET 3.5 erstellen? Ich möchte sie in meinem Serialisierungsschema unterstützen, so dass ich brauche eine Möglichkeit, sie programmatisch zu manipulieren.

bearbeiten später den Anwendungsfall zu klären

Eine zusätzliche Einschränkung ist, dass ich all das in einer Silverlight-Anwendung, so zusätzliche Laufzeiten sind keine Option, und nicht sicher ausgeführt werden, wie im Fluge Codegenerierung funktioniert.

War es hilfreich?

Lösung

Hier ist eine andere Art und Weise ist, scheint direkter.

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

Andere Tipps

Ja, es gibt. Aus dem Gedächtnis:

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

object anon = create(existingAnonymousType);

Mit Reflexion, um die Art zu erhalten, verwenden GetConstructor von der Art, verwenden Sie Invoke auf 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, dass Code zu erzeugen C # gefunden und dann mit CodeDomProvider (aber nicht CodeDOM selbst - schrecklich) und dann dem Kompilieren unten und reflektieren Typen aus, dass ist der einfachste Weg, ‚anonym zu tun 'Objekte zur Laufzeit.

Sie können in das DLR zu suchen. Ich getan havnt so selbst (noch) nicht, aber die Use-Case für das DLR (dynamische Sprachen) wie viel klingt, was Sie versuchen zu tun.

Je nachdem, was Sie wollen, dass die Burg-Rahmen des dynamischen Proxy-Objekt zu tun, könnte auch eine gute Passform sein.

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

Wenn Sie auf dieser Route entscheiden, würde ich vorschlagen, das Herunterladen der Reflection Emit Sprache Addin für . NET Reflector , da dies ermöglicht es Ihnen, wie die bestehenden Klassen sehen Reflexion verwendet werden würde gebaut. auszusenden, damit eine gute Methode für das Erlernen dieser Ecke des Rahmens.

Sie möchten vielleicht auch einen Blick in die FormatterServices Klasse haben: MSDN Eintrag auf FormatterServices

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

In Antwort von Michael Kommentar: Wenn Sie nicht den Typ Beispiel für Typ T haben, können Sie es jederzeit erhalten von typeof (T). Wenn Sie ein Objekt eines unbekannten Typs haben, können Sie GetType () auf sie berufen, um die Type-Instanz zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top