Expression.Call in semplice espressione lambda. È possibile?

.net c# expression-trees lambda

Domanda

Ho bisogno di generare un'espressione lambda come

item => item.Id > 5 && item.Name.StartsWith("Dish")

Ok, item.Id> 5 è semplice

var item = Expression.Parameter(typeof(Item), "item");

var propId = Expression.Property(item,"Id");
var valueId = Expression.Constant(5);
var idMoreThanFive = Expression.GreaterThan(propId, valueId);

Ma la seconda parte è più complessa per me ...

var propName = Expression.Property(item,"Name");
var valueName = Expression.Constant("Dish");

Come chiamare StartsWith per propName?

Risposta accettata

Dovrai ottenere un MethodInfo rappresenta il string.StartsWith(string) e quindi utilizzare Expression.Call per costruire l'espressione che rappresenta la chiamata instancemethod:

var property = Expression.Property(item, "Name");
var method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
var argument = Expression.Constant("Dish");

// item.Name.StartsWith("Dish")
var startsWithDishExpr = Expression.Call(property, method, argument);

Dovrai quindi && le sottoespressioni insieme per creare il corpo.

var lambdaBody = Expression.AndAlso(idMoreThanFive, startsWithDishExpr);

E poi finalmente costruisci il lambda:

var lambda = Expression.Lambda<Func<Item, bool>>(lambdaBody, item);


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é