Instanzieren von anonymen Objekten mithilfe der in String gespeicherten C # -Objekt-Initialisierersyntax

8

Mit der Initialisierersyntax des C # -Objekts kann ich ein anonymes Objekt wie folgt instanziieren:

%Vor%

Aber was ist, wenn ich den Initialisierer in einer Zeichenfolge gespeichert habe, z. B .:

%Vor%

Was ist der beste Weg, um diese Zeichenfolge in eine Instanz des Objekts zu konvertieren?

    
DSO 22.05.2009, 20:57
quelle

5 Antworten

17

Anonyme Klassen sind C # syntaktischer Zucker (siehe Abschnitt Anmerkungen hier ). csc.exe erstellt eine Klasse mit privaten Feldern und eine Lese- / Schreibeigenschaft mit dem vom Kontext abgeleiteten Typ. Alle Verwendungen des Objekts werden wiederum abgeleitet.

Das bedeutet, dass Sie zur Laufzeit keine anonyme Klasse erstellen können, da die CLR sie nicht anders als jede andere Klasse sieht (weil es sich um C # syntaktischen Zucker handelt).

Also stattdessen:

  • Verwende ein Dictionary<string,object>
  • Verwenden Sie JSON.NET, XML oder etwas Ähnliches, das ein bereits definiertes Schema zum Parsen einer Zeichenfolge zum Abrufen eines Objekts hat. Dies erfordert jedoch, dass die Eigenschaften gut definiert sind.
  • Verwenden Sie System.Reflection.Emit , um den Typ zur Laufzeit zu erstellen, aber ich sehe keinen wirklichen Nutzen dafür, nur für ein Dictionary<string,object>

Ich habe auch Bedenken, was Sie tun, weil dies für mich sehr wahrscheinlich bedeutet, dass Sie Benutzereingaben irgendeiner Art akzeptieren. Sei vorsichtig mit den Sicherheitsproblemen bei allem, was du tust.

    
Colin Burnett 22.05.2009, 21:29
quelle
5

Es ist nicht möglich, anonyme Typen zu verwenden, Sie können dies jedoch mit Reflection Emit tun, indem Sie die TypeBuilder-Klasse verwenden, insbesondere TypeBuilder.Create (..).

Ссылка

    
BFree 22.05.2009 21:00
quelle
3

Am besten verwenden Sie die Serialisierung. Aber natürlich verwendet das nicht das gleiche String-Format, das Sie beschrieben haben.

Ihr Objektinitialisierer muss keine konstanten Werte enthalten.

%Vor%

In Ihrem Szenario müssten Sie also die einzelnen Elemente aus Ihrer Zeichenfolge analysieren und einige Konvertierungen vornehmen, um sie in die gewünschten Typen zu konvertieren.

Wenn Sie nicht mit diesem bestimmten Zeichenfolgenformat verheiratet sind, können Sie Ihre Objekte serialisieren und deserialisieren und das gleiche mit XML viel einfacher erreichen.

    
Robert Harvey 22.05.2009 21:10
quelle
2

Es gibt keinen direkten einfachen Weg dazu. Grundsätzlich haben Sie diese Möglichkeiten:

  1. Parsen Sie die Zeichenfolge manuell.
  2. Verwenden Sie den C # -Compiler, um dieses Objekt als Teil einer Assembly zu kompilieren, und verwenden Sie die Reflektion, um den Inhalt herauszufinden.
  3. (nicht sicher, ob es möglich ist, nur C # 4.0): Verwende verwaltete C # 4.0-Compiler-Klassen, um den Ausdruck zu analysieren und auf das Zeug zu schließen.

Keine von denen ist meiner Meinung nach ideal. Ich würde QueryString wie Paare, XML oder JSON oder ein anderes Format mit verfügbaren Parsern betrachten, wenn Sie die Option haben, Daten in einer Wörterbuchinstanz zu speichern, anstatt für jeden Ausdruck ein Objekt zu erstellen.

    
Mehrdad Afshari 22.05.2009 20:59
quelle
1

Ich glaube nicht, dass diese Frage Ihre eigene beantwortet, aber es wird Ihnen sagen, warum es nicht möglich ist, anonyme Instanzen von Objekten zu erstellen, die Zeichenfolgen verwenden, wie Sie es vorschlagen:

Wie erstelle ich eine neue Instanz einer anonymen Klasse, die als Parameter in C # übergeben wurde und auf sie zugreift?

Anonyme Typen haben keine öffentlichen Felder, und obwohl Sie dies für ein benanntes Objekt tun können, ist es für einen anonymen Typ nicht so einfach. Nichtsdestotrotz gibt es nichts, was Sie daran hindern könnte [wie von BFree vorgeschlagen] Reflektionen zu verwenden, um die MSIL für den anonymen Typ zu emittieren - was nicht gerade einfach ist, aber auch nicht unmöglich ist.

    
BenAlabaster 22.05.2009 21:05
quelle

Tags und Links