Frage

Ich mag eine Methode implementieren, die ich eine Eigenschaft eines unbekanntes / anonymen Objekts (-Graph) in eine spät gebundenen / dynamischen Art und Weise zugreifen kann (ich weiß nicht einmal, wie richtig es nennen).

Hier ist ein Beispiel dafür, was Ich mag würde erreichen:

// setup an anonymous object
var a = new { B = new { C = new { I = 33 } } };

// now get the value of a.B.C.I in a late-bound way
var i = Get(a, "B.C.I"); 

Und hier ist eine einfache Implementierung mit „klassischen“ Reflexion:

public static object Get(object obj, string expression)
{
    foreach (var name in expression.Split('.'))
    {
        var property = obj.GetType().GetProperty(name);
        obj = property.GetValue(obj, null);
    }
    return obj;
}

Was andere Möglichkeiten habe ich mit C # / .NET 4 etwas ähnlichem zu implementieren, wie oben gezeigt, aber vielleicht einfacher, performant, etc.?

Vielleicht gibt es Möglichkeiten, das gleiche zu erreichen, die mich expression mit einem Lambda-Ausdruck anstelle einer Zeichenfolge erlauben würden angeben? Würde Ausdruck Bäume hilfreich sein, in irgendeiner Weise (zB wie in diese Frage gezeigt) ?

Aktualisieren : das Objekt und der Ausdruck über einen Web-Service-Aufruf in meinen Code übergeben. Deshalb habe ich object und string in meinem Get() Verfahren verwendet wird.

War es hilfreich?

Lösung

Haben Sie wirklich haben nur den Ausdruck als String? Ist es zum Zeitpunkt der Kompilierung bekannt, nur, dass die Typen selbst nicht bekannt sind (oder sind schwer zu exprimieren)? Wenn ja:

dynamic d = a;
int i = d.B.C.I;

Wenn Sie wirklich es nur als String (z.B. als vom Benutzer eingegebenen Daten), die das Leben viel härter macht, und keine der C # 4 Funktionen helfen Ihnen wirklich. Sie könnten bewerten es möglicherweise als Ironpython-Skript oder so ähnlich ...

EDIT: Okay, nach dem Update, es klingt wie Sie in der letzteren Situation sind - in diesem Fall, ich weiß nicht, von einem schöneren Weg als Reflexion verwendet wird. Einige der integrierte Eigenschaft für UIs gebaut Bindung helfen kann, aber ich weiß nicht, von einer sauberen Art und Weise es zuzugreifen.

Andere Tipps

Wenn Sie C # Stil verwenden möchten, können Sie den Mono-Compiler als Dienst aus Ihrer Anwendung verwenden. Ich beschreibe, wie dies hier zu tun: Mono Compiler als Service (MCS)

Als ein alternativer Ansatz, könnten Sie Reflexion verwenden, um alle Ihre Eigenschaften des Objekts in ein ExpandoObject um es dann wie ein Wörterbuch verwenden (da ExpandoObject implementiert IDictionary). Alternativ können Sie JSON.NET und Call JObject.FromObject verwenden, die ein reguläres Objekt in ein JObject verwandeln wird, die in einem Wörterbuch-Stil zugänglich ist (und als ein zusätzlicher Vorteil rekursive Graph Unterstützung hat). Schließlich könnten Sie die gleiche Methode verwenden, Ihr Objekt in ein Wörterbuch der Wörterbücher dump.

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