C # tiefe / verschachtelte / rekursive Verschmelzung von dynamischen / expando-Objekten

8

Ich muss zwei dynamische Objekte in C # zusammenführen. Alles, was ich auf Stackexchange gefunden habe, umfasste nur nicht-rekursive Zusammenführung. Aber ich suche nach etwas, das rekursiv oder tief zusammenfließt, sehr ähnlich wie jQuerys $.extend(obj1, obj2) -Funktion.

Bei Kollision zweier Mitglieder sollten die folgenden Regeln gelten:

  • Wenn die Typen nicht übereinstimmen, muss eine Ausnahme ausgelöst und die Zusammenführung abgebrochen werden. Ausnahme: obj2 Wert ist möglicherweise null, in diesem Fall ist der Wert & amp; Der Typ von obj1 wird verwendet.
  • Für triviale Typen (Werttypen + String) werden immer Obj1-Werte bevorzugt
  • Für nicht-triviale Typen werden die folgenden Regeln angewendet:
    • IEnumerable & amp; IEnumberables<T> werden einfach zusammengeführt (vielleicht .Concat() ?)
    • IDictionary & amp; IDictionary<TKey,TValue> werden zusammengeführt; Schlüssel obj1 haben Vorrang vor Kollision
    • Expando & amp; Expando[] -Typen müssen rekursiv zusammengeführt werden, während Expando [] immer nur gleichartige Elemente enthält
    • Man kann davon ausgehen, dass es keine Expando-Objekte in Collections (IEnumerabe & amp; IDictionary)
    • gibt
  • Alle anderen Typen können verworfen werden und müssen nicht im resultierenden dynamischen Objekt vorhanden sein

Hier ist ein Beispiel für eine mögliche Zusammenführung:

%Vor%

Irgendwelche Ideen wie man das macht?

    
Dyna 27.01.2012, 17:10
quelle

1 Antwort

3

Richtig, das ist ein bisschen lang, aber sieh es dir an. Es ist eine Implementierung mit Reflection.Emit.

Offenes Problem für mich ist, wie man eine ToString () - Überschreibung implementiert, so dass Sie einen String-Vergleich durchführen können. Kommen diese Werte von einer Konfigurationsdatei oder etwas? Wenn sie im JSON-Format sind, könnte es schlimmer sein, als einen JsonSerializer zu verwenden, denke ich. Kommt drauf an was du willst.

Sie könnten das Expando-Objekt verwenden, um den Reflection.Emit-Unsinn am unteren Rand der Schleife loszuwerden:

%Vor%

Ich sehe keinen Weg durch den unordentlichen Code, um den ursprünglichen Objektbaum zu analysieren, aber nicht sofort. Ich würde gerne andere Meinungen dazu hören. Das DLR ist für mich relativ neu.

%Vor%     
Mel Padden 18.04.2012 06:26
quelle