Я обычно нахожу, что стоит кодировать лямбда-выражение, которое делает то, что я хочу, а затем посмотреть, что с ним делает компилятор C #.
Итак, этот код:
Expression<Func<bool,bool>> func = x => !x;
Составлено в:
ParameterExpression expression2;
Expression<Func<bool, bool>> expression =
Expression.Lambda<Func<bool, bool>>(Expression.Not(
expression2 = Expression.Parameter(typeof(bool), "x")),
new ParameterExpression[] { expression2 });
(Извиняюсь за форматирование - сложно понять, что с этим делать.)
Он декомпилирован с помощью Reflector, но его «оптимизация» установлена на .NET 2.0, чтобы избежать использования лямбда-синтаксиса.
Как только вы пройдете через мусор, вы увидите, что он использует Expression.Not
. && использует Expression.AndAlso
и || использует Expression.OrElse
.