Skip to content

Instantly share code, notes, and snippets.

@kamyar1979
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kamyar1979/9482462 to your computer and use it in GitHub Desktop.
Save kamyar1979/9482462 to your computer and use it in GitHub Desktop.
CheckNull code for C# Expressions.
public static Expression<Func<T, T>> CheckNull<T>(Expression<Func<T, T>> expression)
{
var body = expression.Body as MemberInitExpression;
return Expression.Lambda<Func<T, T>>(AddCheckNull<T>(body, expression.Parameters[0]), expression.Parameters);
}
public static MemberInitExpression AddCheckNull<T>(MemberInitExpression expression, Expression parameter)
{
var memberParams = new List<MemberBinding>();
foreach (var item in expression.Bindings)
{
var assignment = (item as MemberAssignment);
if (assignment.Expression is MemberInitExpression)
{
memberParams.Add(AddCheckNull<T>(item, assignment.Member as PropertyInfo, parameter));
}
else
{
memberParams.Add(item);
}
}
return Expression.MemberInit(expression.NewExpression, memberParams.ToArray());
}
public static MemberBinding AddCheckNull<T>(MemberBinding binding, PropertyInfo property, Expression parameter)
{
var assignment = binding as MemberAssignment;
var propertyExpression = Expression.Property(parameter, property);
if (assignment.Expression is MemberInitExpression)
{
return assignment.Update(Expression.Condition(Expression.NotEqual(propertyExpression, Expression.Constant(null, property.PropertyType)), AddCheckNull<T>(assignment.Expression as MemberInitExpression, propertyExpression), Expression.Constant(null, property.PropertyType)));
}
else
{
return assignment.Update(Expression.Condition(Expression.NotEqual(propertyExpression, Expression.Constant(null, property.PropertyType)), assignment.Expression, Expression.Constant(null, property.PropertyType)));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment