Erstellen einer Ausdrucksstruktur für den Zugriff auf die Eigenschaft eines generischen Typs

c# expression-trees generics linq

Frage

Ich muss eine generische Methode schreiben, die die Instanz des generischen Typs und des Eigenschaftsnamens im String-Format übernimmt und eine Ausdrucksbaumstruktur zurückgibt

Ich muss einen einfachen Lambda-Ausdruck konvertieren

a => a.SomePropertyName

wobei a a generischer Typ ist, der eine Eigenschaft mit dem Namen SomePropertyName

Ich weiß, dass wir die Eigenschafteninformationen mit dem folgenden Reflexionscode erhalten können

System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");

Das könnte sehr einfach sein, aber ich bin nicht gut mit Expression-Bäumen vertraut. Wenn es eine ähnliche Frage gibt, verlinke sie bitte und schließe dies

Akzeptierte Antwort

Unter der Annahme, dass der Parametertyp und der Rückgabetyp nicht im Voraus bekannt sind, müssen Sie möglicherweise ein object , aber im Grunde ist dies nur Folgendes:

var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
    Expression.Convert(
        Expression.PropertyOrField(
             Expression.Convert(p, a.GetType()), propName), typeof(object)), p);

Wenn die Eingabe- und Ausgabetypen bekannt sind, können Sie die Parameter Func<,> optimieren und möglicherweise die Expression.Convert entfernen. Am äußersten Ende können Sie ein Lambda erhalten, ohne die Signatur von Lambda zu kennen :

var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);

Beliebte Antwort

Sie können dies verwenden:

var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");

Expression.Lambda(body, p);


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum