Лямбда-выражения: как проанализировать, как делегат хранится в виде выражения? - PullRequest
1 голос
/ 16 мая 2011

Этот код:

var lambda = Products.Where( p => p.name == "chair");

можно записать так:

var propertyName = "name";
var value = "chair";
var arg = Expression.Parameter(typeof(Product), "p");
var property = typeof(Product).GetProperty(propertyName);
var comparison = Expression.Equal(
    Expression.MakeMemberAccess(arg, property),
    Expression.Constant(value));
var lambda = Expression.Lambda<Func<Product, bool>>(comparison, arg).Compile();

Если у меня есть какое-нибудь лямбда-выражение, подобное этому:

Products.Where( p => p.name.Contains("chair") );

Как я могу определить, как написать выражение, как указано выше? Есть ли способ отладки дерева выражений, чтобы я мог запрограммировать его вручную?

EDIT:

Я видел многообещающие ответы здесь , но это не заканчивалось рабочим кодом. Вот их версия (ошибка в том, что методу StartsWith присвоено нестроковое значение):

ParameterExpression p = Expression.Parameter(typeof(Product), "p");
MethodInfo method = typeof(string).GetMethod("StartsWith", 
    new[] { typeof(string) });
var containsMethodExp = Expression.Call(p, method, 
    Expression.Constant("root"), p);

1 Ответ

2 голосов
/ 16 мая 2011

Просто позвольте компилятору сделать всю работу.

Если вы вместо

func<string,bool> MyLambda = p => p.name.Contains("chair");

напишите

Expression<func<string,bool>> MyExpression = p => p.name.Contains("chair");

Тогда вы получите хорошее «MyExpression», которое вы можете проверить в отладчике.

...