Декларативно построить дерево выражений с корнем в узле любого типа - PullRequest
0 голосов
/ 15 сентября 2009

MSDN говорят:

Компилятор также может создать дерево выражения для вас. сгенерированное компилятором дерево выражений всегда коренится в узле типа Выражение ; то есть его корневой узел представляет собой лямбду выражение.

Но что, если я хочу построить дерево выражений с корнем в узле типа MethodCallExpression, BinaryExpression и т. Д.? И не хочу делать это вручную.

1 Ответ

1 голос
/ 15 сентября 2009

Обходной путь должен объявить 2 вспомогательные функции

public Expression GetBody(Expression<Action> lambda)
{
    return lambda.Body;
}

public Expression GetBody<TResult>(Expression<Func<TResult>> lambda)
{
    return lambda.Body;
}

Примеры использования:

var e1 = (MethodCallExpression)GetBody(() => this.FunA());
var e2 = (ConstantExpression)GetBody(() => 4 + 5);
var e3 = (BinaryExpression)GetBody(() => a + b);
...