Подтвердить что ты не робот

Expression.Call в простом лямбда-выражении. Является ли это возможным?

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

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?

4b9b3361

Ответ 1

Вам нужно получить MethodInfo, представляющий метод string.StartsWith(string), а затем использовать Expression.Call, чтобы построить выражение, представляющее вызов 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);

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

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

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

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