in tools/AutoMapper/XpressionMapper/Extensions/VisitorExtensions.cs [105:139]
public static ParameterExpression GetParameterExpression(this Expression expression)
{
if (expression == null)
return null;
//the node represents parameter of the expression
switch (expression.NodeType)
{
case ExpressionType.Parameter:
return (ParameterExpression)expression;
case ExpressionType.Quote:
return GetParameterExpression(GetMemberExpression((LambdaExpression)((UnaryExpression)expression).Operand));
case ExpressionType.Lambda:
return GetParameterExpression(GetMemberExpression((LambdaExpression)expression));
case ExpressionType.ConvertChecked:
case ExpressionType.Convert:
var ue = expression as UnaryExpression;
return GetParameterExpression(ue?.Operand);
case ExpressionType.MemberAccess:
return GetParameterExpression(((MemberExpression)expression).Expression);
case ExpressionType.Call:
var methodExpression = expression as MethodCallExpression;
var memberExpression = methodExpression?.Object as MemberExpression;//Method is an instance method
var isExtension = methodExpression != null && methodExpression.Method.IsDefined(typeof(ExtensionAttribute), true);
if (isExtension && memberExpression == null && methodExpression.Arguments.Count > 0)
memberExpression = methodExpression.Arguments[0] as MemberExpression;//Method is an extension method based on the type of methodExpression.Arguments[0] and methodExpression.Arguments[0] is a member expression.
return isExtension && memberExpression == null && methodExpression.Arguments.Count > 0
? GetParameterExpression(methodExpression.Arguments[0])
: (memberExpression == null ? null : GetParameterExpression(memberExpression.Expression));
}
return null;
}