/// <summary> /// An Expression extension method that gets a property or field access from an expression. /// </summary> /// <exception cref="Exception">Thrown when an exception error condition occurs.</exception> /// <param name="expression">The expression to act on.</param> /// <param name="parameterExpression">The parameter expression.</param> /// <returns>The property or field access from the expression.</returns> internal static PropertyOrFieldAccessor GetPropertyOrFieldAccess(this Expression expression, ParameterExpression parameterExpression, MemberInfo member = null) { var memberName = member != null ? member.Name : ""; var paths = new List <MemberInfo>(); MemberExpression memberExpression; do { memberExpression = RemoveConvert(expression) as MemberExpression; if (memberExpression == null) { return(new PropertyOrFieldAccessor(true) { Member = memberName }); } var propertyInfo = memberExpression.Member as PropertyInfo; var fieldInfo = memberExpression.Member as FieldInfo; if (propertyInfo != null) { paths.Add(propertyInfo); } if (fieldInfo != null) { paths.Add(fieldInfo); } expression = memberExpression.Expression; } while (memberExpression.Expression != parameterExpression); paths.Reverse(); var accessor = new PropertyOrFieldAccessor(paths.AsReadOnly()); if (memberName == "") { memberName = accessor.ToString(); } accessor.Member = memberName; return(accessor); }
/// <summary> /// An Expression extension method that gets a property or field access from an expression. /// </summary> /// <exception cref="Exception">Thrown when an exception error condition occurs.</exception> /// <param name="expression">The expression to act on.</param> /// <param name="parameterExpression">The parameter expression.</param> /// <returns>The property or field access from the expression.</returns> internal static PropertyOrFieldAccessor GetPropertyOrFieldAccess(this Expression expression, ParameterExpression parameterExpression, MemberInfo member = null) { var memberName = member != null ? member.Name : ""; var paths = new List<MemberInfo>(); MemberExpression memberExpression; do { memberExpression = RemoveConvert(expression) as MemberExpression; if (memberExpression == null) { return new PropertyOrFieldAccessor(true) {Member = memberName}; } var propertyInfo = memberExpression.Member as PropertyInfo; var fieldInfo = memberExpression.Member as FieldInfo; if (propertyInfo != null) { paths.Add(propertyInfo); } if (fieldInfo != null) { paths.Add(fieldInfo); } expression = memberExpression.Expression; } while (memberExpression.Expression != parameterExpression); paths.Reverse(); var accessor = new PropertyOrFieldAccessor(paths.AsReadOnly()); if (memberName == "") { memberName = accessor.ToString(); } accessor.Member = memberName; return accessor; }