LuckyPennySoftware/AutoMapper · error · ArgumentOutOfRangeException

Unexpected member.

Error message

Unexpected member.

What it means

Internal defensive error thrown by ExpressionBuilder.Chain when a MemberInfo in a member-access expression chain is not a PropertyInfo, FieldInfo, or MethodInfo (static or instance). The switch expression's default arm fires. This occurs during execution-plan compilation when AutoMapper walks a member chain extracted from a user lambda and encounters an unsupported member kind.

Source

Thrown at src/AutoMapper/Execution/ExpressionBuilder.cs:215

        return result;
    }
    public static LambdaExpression Lambda(this MemberInfo member) => new[] { member }.Lambda();
    public static LambdaExpression Lambda(this MemberInfo[] members)
    {
        var source = Parameter(members[0].DeclaringType, "source");
        return Expression.Lambda(members.Chain(source), source);
    }
    public static Expression Chain(this MemberInfo[] members, Expression target)
    {
        foreach (var member in members)
        {
            target = member switch
            {
                PropertyInfo property => Expression.Property(target, property),
                MethodInfo { IsStatic: true } getter => Expression.Call(getter, target),
                FieldInfo field => Field(target, field),
                MethodInfo getter => Expression.Call(target, getter),
                _ => throw new ArgumentOutOfRangeException(nameof(member), member, "Unexpected member.")
            };
        }
        return target;
    }
    public static MemberInfo[] GetMembersChain(this LambdaExpression lambda) => lambda.Body.GetChain().ToMemberInfos();
    public static MemberInfo GetMember(this LambdaExpression lambda) =>
        (lambda?.Body is MemberExpression memberExpression && memberExpression.Expression == lambda.Parameters[0]) ? memberExpression.Member : null;
    public static MemberInfo[] ToMemberInfos(this Stack<Member> chain)
    {
        var members = new MemberInfo[chain.Count];
        int index = 0;
        foreach (var member in chain)
        {
            members[index++] = member.MemberInfo;
        }
        return members;
    }
    public static Stack<Member> GetChain(this Expression expression)

View on GitHub (pinned to dfa6dd587c)

Solutions

  1. Simplify the MapFrom or ForPath expression to use only property accesses, field accesses, and method calls.
  2. Remove any event subscriptions or non-property/field/method references from the mapping expression.
  3. If the expression is valid and you believe AutoMapper should support it, file a bug report with a reproduction.

Example fix

// before — unsupported member in chain (e.g., event access)
CreateMap<Source, Dest>().ForMember(d => d.Value, opt => opt.MapFrom(s => s.SomeEvent));

// after — use a property or method
CreateMap<Source, Dest>().ForMember(d => d.Value, opt => opt.MapFrom(s => s.GetValue()));
Defensive patterns

Strategy: try-catch

Validate before calling

// Validate that the expression body only contains supported member types before mapping
static bool IsValidMemberChain(LambdaExpression lambda)
{
    foreach (var member in lambda.Body.GetChain().Select(m => m.MemberInfo))
    {
        if (member is not (PropertyInfo or FieldInfo or MethodInfo))
            return false;
    }
    return true;
}

Try / catch

try
{
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Source, Dest>()
        .ForMember(d => d.Val, opt => opt.MapFrom(s => s.GetValue())));
    config.CompileMaps(); // triggers plan building
}
catch (AutoMapperMappingException ex) when (ex.InnerException is ArgumentOutOfRangeException)
{
    // Log and simplify the mapping expression
    logger.LogError(ex, "Unsupported member in expression chain. Simplify to property/field/method accesses.");
}

Prevention

When it happens

Trigger: An expression passed to MapFrom, ForPath, or a member path that contains a member type AutoMapper does not handle (e.g., an EventInfo or a TypeInfo nested in the chain). The chain is built from GetChain which recognizes MemberExpression and MethodCallExpression nodes.

Common situations: Rarely hit directly by end users; usually indicates an unsupported expression shape in a MapFrom lambda or a member path that resolves to an event or nested type. May also indicate a bug in a custom IObjectMapper.

Related errors


AI-assisted analysis of LuckyPennySoftware/AutoMapper@dfa6dd587c (2026-08-13). Data as JSON: /api/errors/8383fd600d8d1ff3. Report an issue: GitHub.