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
- Simplify the MapFrom or ForPath expression to use only property accesses, field accesses, and method calls.
- Remove any event subscriptions or non-property/field/method references from the mapping expression.
- 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
- Use only property accesses, field accesses, and method calls in MapFrom and ForPath expressions.
- Avoid event accesses or other non-standard member types in mapping expressions.
- Run AssertConfigurationIsValid or CompileMaps in tests to surface plan-building errors early.
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
- Error building path mapping strategy.
- Error building member mapping strategy.
- Error building constructor parameter mapping strategy.
- Cannot find suitable method {type}.{methodName}({parametersC
- Cannot find member {name} of type {type}.
AI-assisted analysis of LuckyPennySoftware/AutoMapper@dfa6dd587c (2026-08-13).
Data as JSON: /api/errors/8383fd600d8d1ff3.
Report an issue: GitHub.