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. |