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); }
// 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); } }