Expressions Cheat Sheet
I started getting really tired of looking up the translation between the ExpressionType and concrete Expression type (they don’t match up), so I created this cheat sheet that has each ExpressionType, derived Expression type and a simple example. What’s interesting is a few are only available in VB.NET, but no one really wants non-short-circuited Or/And operators, do they? You can download the PDF version, or just view the big list in all its glory:
| ExpressionType | Type | Example |
| Add | BinaryExpression |
int i = 2, j = 3; Expression<Func<int>> example = () => i + j; |
| AddChecked | BinaryExpression |
int i = Int32.MaxValue, j = 1; Expression<Func<int>> example = () => checked(i + j); |
| And | BinaryExpression |
Dim i As Boolean = True, j As Boolean = False Dim sample As Expression(Of Func(Of Boolean)) = _ Function() i And j |
| AndAlso | BinaryExpression |
bool i = true, j = false; Expression<Func<bool>> example = () => i && j; |
| ArrayLength | UnaryExpression |
int[] values = {1, 2, 3}; Expression<Func<int>> example = () => values.Length; |
| ArrayIndex | MethodCallExpression |
int[] values = {1, 2, 3}; Expression<Func<int>> example = () => values[1]; |
| Call | MethodCallExpression |
var sample = new Sample(); Expression<Func<int>> example = () => sample.Calc(); |
| Coalesce | BinaryExpression |
int? i = null, j = 5; Expression<Func<int?>> example = () => i ?? j; |
| Conditional | ConditionalExpression |
int i = 3, j = 5; bool k = false; Expression<Func<int?>> example = () => k ? i : j; |
| Constant | ConstantExpression |
Expression<Func<int>> example = () => 5; |
| Convert | UnaryExpression |
int i = 5; object j = i; Expression<Func<int>> example = () => (int) j; |
| ConvertChecked | UnaryExpression |
long i = 5; Expression<Func<int>> example = () => checked((int)i); |
| Divide | BinaryExpression |
int i = 21, j = 3; Expression<Func<int>> example = () => i / j; |
| Equal | BinaryExpression |
int i = 21, j = 3; Expression<Func<bool>> example = () => i == j; |
| ExclusiveOr | BinaryExpression |
int i = 12, j = 7; Expression<Func<int>> example = () => i ^ j; |
| GreaterThan | BinaryExpression |
int i = 12, j = 7; Expression<Func<bool>> example = () => i > j; |
| GreaterThanOrEqual | BinaryExpression |
int i = 12, j = 7; Expression<Func<bool>> example = () => i >= j; |
| Invoke | InvocationExpression |
Expression<Func<int, int, int>> expr = (i, j) => i + j; Expression invoke = Expression.Invoke( expr, Expression.Constant(5), Expression.Constant(4)); Expression<Func<int>> example = Expression.Lambda<Func<int>>(invoke); |
| Lambda | LambdaExpression |
Expression<Func<int>> example = Expression.Lambda<Func<int>>(Expression.Constant(5)); |
| LeftShift | BinaryExpression |
int i = 8; Expression<Func<int>> example = () => i << 1; |
| LessThan | BinaryExpression |
int i = 12, j = 7; Expression<Func<bool>> example = () => i < j; |
| LessThanOrEqual | BinaryExpression |
int i = 12, j = 7; Expression<Func<bool>> example = () => i <= j; |
| ListInit | ListInitExpression |
Expression<Func<List<int>>> example = () => new List<int> {1, 2, 3}; |
| MemberAccess | MemberExpression |
var c = new Customer {Name = "Bob"}; Expression<Func<string>> example = () => c.Name; |
| MemberInit | MemberInitExpression |
Expression<Func<Customer>> example = () => new Customer {Name = "Bob"}; |
| Modulo | BinaryExpression |
int i = 5, j = 3; Expression<Func<int>> example = () => i % j; |
| Multiply | BinaryExpression |
int i = 5, j = 3; Expression<Func<int>> example = () => i * j; |
| MultiplyChecked | BinaryExpression |
int i = 5, j = 3; Expression<Func<int>> example = () => checked(i * j); |
| Negate | UnaryExpression |
int i = 5; Expression<Func<int>> example = () => -i; |
| UnaryPlus | UnaryExpression |
var m = new Money { Amount = -10m }; Expression<Func<Money>> example = () => +m; |
| NegateChecked | UnaryExpression |
int i = 5; Expression<Func<int>> example = () => checked(-i); |
| New | NewExpression |
Expression<Func<Customer>> example = () => new Customer(); |
| NewArrayInit | NewArrayExpression |
Expression<Func<int[]>> example = () => new[] {1, 2, 3}; |
| NewArrayBounds | NewArrayExpression |
Expression<Func<int[]>> example = () => new int[10]; |
| Not | UnaryExpression |
bool val = true; Expression<Func<bool>> example = () => !val; |
| NotEqual | BinaryExpression |
int i = 4, j = 7; Expression<Func<bool>> example = () => i != j; |
| Or | BinaryExpression |
Dim i As Boolean = True, j As Boolean = False Dim sample As Expression(Of Func(Of Boolean)) = _ Function() i Or j |
| OrElse | BinaryExpression |
bool i = true, j = false; Expression<Func<bool>> example = () => i || j; |
| Parameter | ParameterExpression |
// (i, j) => i + j; ParameterExpression param1 = Expression.Parameter(typeof (int), "i"); ParameterExpression param2 = Expression.Parameter(typeof (int), "j"); var addExpression = Expression.Add(param1, param2); var example = Expression.Lambda<Func<int, int, int>>( addExpression, param1, param2); |
| Power | BinaryExpression |
Dim i As Integer = 3, j As Integer = 2 Dim sample As Expression(Of Func(Of Integer)) = _ Function() i ^ j |
| Quote | UnaryExpression |
int i = 3, j = 2; Expression<Func<int>> inner = () => i * j; var quoted = Expression.Quote(inner); Expression<Func<Expression<Func<int>>>> example = Expression.Lambda<Func<Expression<Func<int>>>>(quoted); |
| RightShift | BinaryExpression |
int i = 8; Expression<Func<int>> example = () => i >> 1; |
| Subtract | BinaryExpression |
int i = 8, j = 5; Expression<Func<int>> example = () => i - j; |
| SubtractChecked | BinaryExpression |
int i = 8, j = 5; Expression<Func<int>> example = () => checked(i - j); |
| TypeAs | UnaryExpression |
var c = new Customer {Name = "Bob"}; Expression<Func<Person>> example = () => c as Person; |
| TypeIs | TypeBinaryExpression |
var c = new Customer {Name = "Bob"}; Expression<Func<bool>> example = () => c is int; This is only for C# 3.0, the .NET 4.0 list should grow quite a bit. |
