Beispiel #1
0
 public static bool IsPropertyReadExpression(LambdaExpression instance, LambdaExpression prop, string altInstanceArgName = default, string altPropArgName = default)
 {
     instance.EnsureNotNull(nameof(instance));
     prop.EnsureNotNull(string.IsNullOrEmpty(altPropArgName) ? nameof(prop) : altPropArgName);
     //
     if (prop.Body is MemberExpression memberExpr)
     {
         var propertyMember = memberExpr.Member as PropertyInfo;
         if (propertyMember == null || !propertyMember.IsNonStaticRead())
         {
             return(false);
         }
         Type propertyAccessInstanceType;
         if (memberExpr.Expression is ConstantExpression accessConstantExpr)
         {
             propertyAccessInstanceType = accessConstantExpr.Type;
         }
         else if (memberExpr.Expression is MemberExpression accessMemberExpr)
         {
             var accessMemberField = accessMemberExpr.Member as FieldInfo;
             if (accessMemberField == null)
             {
                 return(false);
             }
             propertyAccessInstanceType = accessMemberField.FieldType;
         }
         else if (memberExpr.Expression is ParameterExpression accessParameterExpr)
         {
             propertyAccessInstanceType = accessParameterExpr.Type;
         }
         else
         {
             return(false);
         }
         if (instance.ReturnType.IsAssignableFrom(propertyAccessInstanceType) && propertyMember.DeclaringType.IsAssignableFrom(instance.ReturnType))
         {
             return(true);
         }
     }
     return(false);
 }
Beispiel #2
0
        // TODO: Put strings into the resources.
        //
        public static MemberInfo ExtractMember(LambdaExpression expr, string altExprArgName = default)
        {
            var argName = string.IsNullOrEmpty(altExprArgName) ? nameof(expr) : altExprArgName.FmtStr().G();

            expr.EnsureNotNull(argName);
            //
            var exprBody = expr.Body;

            if (exprBody is MemberExpression bodyAsMemberExpr)
            {
                return(bodyAsMemberExpr.Member);
            }
            else if (exprBody is MethodCallExpression bodyAsMethodCallExpr)
            {
                return(bodyAsMethodCallExpr.Method);
            }
            else
            {
                throw new ArgumentException(message: $"Specified expression does not access a member and doesn't access a method.{Environment.NewLine}\tExpression:{expr.FmtStr().GNLI2()}", paramName: argName);
            }
        }