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?
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:
Dictionary<string,object>
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.
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.
Es gibt keinen direkten einfachen Weg dazu. Grundsätzlich haben Sie diese Möglichkeiten:
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.
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:
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.