Advertisement
Guest User

NullHelper

a guest
Sep 13th, 2010
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.08 KB | None | 0 0
  1.     public static class NullHelper
  2.     {
  3.         public static Func<T, bool> GetNullCheck<T, TProperty>(Expression<Func<T, TProperty>> expression)
  4.         {
  5.             var memberExpressions = GetMembersExpressions(expression.Body);
  6.             var funcs = memberExpressions.Select(exp => ConvertToFunc(exp));
  7.             var funcStack = new Stack<Func<object,object>>(funcs);
  8.  
  9.             return obj => {
  10.                 if (obj == null)
  11.                     return false;
  12.  
  13.                 object currentObj = obj;
  14.                 foreach (Func<object, object> func in funcStack)
  15.                 {
  16.                     object memberValue = func(currentObj);
  17.                     if (memberValue == null)
  18.                         return false;
  19.  
  20.                     currentObj = memberValue;
  21.                 }
  22.  
  23.                 return true;
  24.             };
  25.         }
  26.  
  27.         private static IEnumerable<Expression> GetMembersExpressions(Expression expression)
  28.         {
  29.             yield return expression;
  30.  
  31.             var leftSide = GetLeftSideOfExpression(expression);
  32.             while (leftSide != null && IsConvertibleToFunc(leftSide))
  33.             {
  34.                 yield return leftSide;
  35.                 leftSide = GetLeftSideOfExpression(leftSide);
  36.             }
  37.         }
  38.  
  39.         private static Expression GetLeftSideOfExpression(Expression expression)
  40.         {
  41.             var member = expression as MemberExpression;
  42.             if (member != null)
  43.                 return member.Expression;
  44.  
  45.             var call = expression as MethodCallExpression;
  46.             if (call != null)
  47.                 return call.Object;
  48.  
  49.             return null;
  50.         }
  51.  
  52.         private static bool IsConvertibleToFunc(Expression expression)
  53.         {
  54.             return expression is MemberExpression || expression is MethodCallExpression;
  55.         }
  56.  
  57.         private static Func<object, object> ConvertToFunc(Expression expression)
  58.         {
  59.             var memberExpression = expression as MemberExpression;
  60.             if (memberExpression != null)
  61.             {
  62.                 var propertyInfo = memberExpression.Member as PropertyInfo;
  63.                 if (propertyInfo != null)
  64.                 {
  65.                     var input = Expression.Parameter(typeof(object), "obj");
  66.                     var convertedInput = Expression.Convert(input, propertyInfo.DeclaringType);
  67.  
  68.                     var lambda = Expression.Lambda<Func<object, object>>(
  69.                         Expression.Convert(Expression.Property(convertedInput, propertyInfo), typeof(object)),
  70.                         input
  71.                     );
  72.  
  73.                     return lambda.Compile();
  74.                 }
  75.  
  76.                 var fieldInfo = memberExpression.Member as FieldInfo;
  77.                 if (fieldInfo != null)
  78.                 {
  79.                     var input = Expression.Parameter(typeof(object), "obj");
  80.                     var convertedInput = Expression.Convert(input, fieldInfo.DeclaringType);
  81.  
  82.                     var lambda = Expression.Lambda<Func<object, object>>(
  83.                         Expression.Convert(Expression.Field(convertedInput, fieldInfo), typeof(object)),
  84.                         input
  85.                     );
  86.  
  87.                     return lambda.Compile();
  88.                 }
  89.             }
  90.  
  91.             var methodCallExpression = expression as MethodCallExpression;
  92.             if (methodCallExpression != null)
  93.             {
  94.                 var methodInfo = methodCallExpression.Method;
  95.  
  96.                 var input = Expression.Parameter(typeof(object), "obj");
  97.                 var convertedInput = Expression.Convert(input, methodInfo.DeclaringType);
  98.  
  99.                 var lambda = Expression.Lambda<Func<object, object>>(
  100.                     Expression.Convert(Expression.Call(convertedInput, methodInfo, methodCallExpression.Arguments.ToArray()), typeof(object)),
  101.                     input
  102.                 );
  103.  
  104.                 return lambda.Compile();
  105.             }
  106.  
  107.             throw new ArgumentException("Must be a property, field, or method.", "expression");
  108.         }
  109.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement