Expression.Call im einfachen Lambda-Ausdruck. Ist es möglich?

.net c# expression-trees lambda

Frage

Ich brauche einen Lambda-Ausdruck wie

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

Ok, item.Id> 5 ist einfach

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

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

Aber der zweite Teil ist für mich komplexer ...

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

Wie StartsWith für PropName aufrufen?

Akzeptierte Antwort

Sie erhalten eine bekommen müssen MethodInfo , die die string.StartsWith(string) Methode und verwenden Sie dann Expression.Call den Ausdruck Aufruf , die die instancemethod zu konstruieren:

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

Sie müssen dann && die Teilausdrücke zusammenlegen, um den Körper zu erstellen.

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

Und dann konstruiere endlich das Lambda:

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


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