Initialisiere ein Objekt vom Typ T aus Dictionarystring, Objekt

8

Ich suche nach einem generischen / "Standard" -Weg, um ein Objekt irgendeines Typs T aus einer Gruppe von Paaren String, Objekt zu instanziieren. Für mich sieht es so aus, als müsste es einen bekannten Weg geben, aber ich kann es nicht finden, also habe ich diesen Code entwickelt. Weiß jemand etwas besser?

%Vor%

    
AC. 01.03.2010, 02:10
quelle

3 Antworten

2

DataContractJsonSerializer ist zu langsam, aber Sie verwenden Reflektion? Wenn Sie viele Objekte deserialisieren müssen, würde ich empfehlen, kompilierte Lambdas anstelle von Reflektionen zu verwenden. Ein Lambda kann nur Eigenschaften festlegen, keine Felder (zumindest in .Net 3.5), also müssen Sie möglicherweise die Klassen anpassen, für die Sie es verwenden, aber es lohnt sich, weil es 1000-mal schneller ist.

Hier ist eine Funktion, die einen Eigenschaften-Setzer erstellt, der einen Typ und ein PropertyInfo für die festzulegende Eigenschaft enthält:

%Vor%

Sie hätten für jede Klasse ein Setterwörterbuch, und wenn Sie eine Eigenschaft einer Klasse setzen müssen, würden Sie den Setter für diese Eigenschaft im Wörterbuch nachschlagen und ihn mit dem zuzuweisenden Wert aufrufen: setters[propName](_this_, value);

    
Gabe 01.03.2010, 05:03
quelle
1

Ich könnte vorschlagen FormatterServices.PopulateObjectMembers , außer a: das ist immer noch langsam AFAIK, und b: Ich habe es versucht (unten) und es scheint eine Ausnahme auf der Eigenschaft werfen wollen (weiß nicht warum; nicht schau zu tief). Eine andere Option kann Expression sein, aber Sie möchten nicht wirklich Compile jedesmal machen (besser, es nur einmal zu tun und es zu cachen, aber das verlangt ein bekanntes Format).

%Vor%

Schließlich können Sie eine Gruppe vorkompilierter Action<object> setter zwischenspeichern (die mit dem Membernamen verknüpft sind). In Wirklichkeit ist dies wahrscheinlich die beste Wahl. Eigenschaften sind einfach (Sie verwenden Delegate.CreateDelegate) - Felder benötigen möglicherweise DynamicMethod - aber wenn Sie das Layout nicht im Voraus vorhersagen können, hat es den geringsten Overhead.

Für den Schlüssel / IL-Ansatz (Sie werden nicht schneller):

%Vor%     
Marc Gravell 01.03.2010 05:27
quelle
0

DataContractJsonSerializer

Warum sollten Sie einen benutzerdefinierten Serializer erstellen und den DataContractJsonSerializer nicht verwenden?

BEARBEITEN

Wenn DataContractJsonSerializer nicht zu Ihnen passt, können Sie JSON.Net ausprobieren. Die effiziente Implementierung eines Serialisierers ist keine leichte Aufgabe. Es gibt viele Fallstricke und Spezialfälle, in die Sie möglicherweise nicht einsteigen möchten. Übrigens, Ihr Code-Sample nutzt Reflexionen, die langsam sind. Ich bezweifle, dass es besser funktioniert als DataContractJsonSerializer oder JSON.Net.

    
Jeff Cyr 01.03.2010 02:29
quelle

Tags und Links