Выражение. Вызов в простом лямбда-выражении. Является ли это возможным? - PullRequest
12 голосов
/ 30 ноября 2011

Мне нужно сгенерировать лямбда-выражение типа

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

Хорошо, item.Id> 5 просто

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

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

Но вторая часть для меня сложнее ...

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

Как позвонить в StartsWith для propName?

1 Ответ

17 голосов
/ 30 ноября 2011

Вам нужно получить MethodInfo, представляющий метод string.StartsWith(string), а затем использовать Expression.Call для построения выражения, представляющего вызов метода instance:

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

YouЗатем вам нужно будет && подвыражений вместе создать тело.

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

И, наконец, построить лямбду:

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