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
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);
Puoi usare questo:
var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");
Expression.Lambda(body, p);