Creazione di albero di espressioni per l'accesso alla proprietà di un tipo generico

c# expression-trees generics linq

Domanda

Devo scrivere un metodo generico che prenda l'istanza del tipo generico e il nome della proprietà in formato stringa e restituisca un albero espressione

Ho bisogno di convertire una semplice espressione lambda

a => a.SomePropertyName

dove a è a tipo generico che avrà una proprietà con il nome SomePropertyName

So che possiamo ottenere le informazioni sulla proprietà usando il seguente codice di riflessione

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

Questo potrebbe essere molto semplice, ma non sono esperto con gli alberi di espressione, se c'è una domanda simile, si prega di collegarlo e chiudere questo

Risposta accettata

Supponendo che il tipo di parametro e il tipo di ritorno non siano noti in anticipo, potresti dover utilizzare qualche object , ma fondamentalmente questo è solo:

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);

Se i tipi di input e output sono noti, puoi modificare i parametri Func<,> e forse rimuovere Expression.Convert . All'estremità estrema è possibile ottenere un lambda senza conoscere la firma di lambda , tramite:

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

Risposta popolare

Puoi usare questo:

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

Expression.Lambda(body, p);


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché