Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/AutoMapper/Execution/ExpressionBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public static class ExpressionBuilder
public static readonly Expression True = Constant(true, typeof(bool));
public static readonly Expression Null = Constant(null, typeof(object));
public static readonly Expression Empty = Empty();
public static readonly LambdaExpression EmptyLambda = Expression.Lambda(Empty);
public static readonly Expression Zero = Constant(0, typeof(int));
public static readonly ParameterExpression ExceptionParameter = Parameter(typeof(Exception), "ex");
public static readonly ParameterExpression ContextParameter = Parameter(typeof(ResolutionContext), "context");
Expand Down Expand Up @@ -74,7 +75,8 @@ public static Expression MapExpression(this IGlobalConfiguration configuration,
if (typeMap != null)
{
var allowNull = memberMap?.AllowNull;
nullCheck = !typeMap.HasTypeConverter && allowNull.HasValue && allowNull != profileMap.AllowNullDestinationValues;
nullCheck = !typeMap.HasTypeConverter && (destination.NodeType != ExpressionType.Default ||
(allowNull.HasValue && allowNull != profileMap.AllowNullDestinationValues));
if (!typeMap.HasDerivedTypesToInclude)
{
typeMap.Seal(configuration);
Expand Down
6 changes: 3 additions & 3 deletions src/AutoMapper/Execution/TypeMapPlanBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ private Expression CreateConstructorParameterExpression(ConstructorParameterMap
var customSource = GetCustomSource(ctorParamMap);
var resolvedExpression = BuildValueResolverFunc(ctorParamMap, customSource, defaultValue);
var resolvedValue = Variable(resolvedExpression.Type, "resolvedValue");
var mapMember = MapMember(ctorParamMap, defaultValue, resolvedValue);
var mapMember = MapMember(ctorParamMap, resolvedValue, defaultValue);
_variables.Clear();
_variables.Add(resolvedValue);
_expressions.Clear();
Expand Down Expand Up @@ -328,7 +328,7 @@ private Expression CreatePropertyMapFunc(MemberMap memberMap, Expression destina
var valueResolver = BuildValueResolverFunc(memberMap, customSource, destinationMemberGetter);
var resolvedValueVariable = Variable(valueResolver.Type, "resolvedValue");
var destinationMemberValue = DestinationMemberValue(memberMap, destinationMemberGetter, destinationMemberReadOnly);
var mappedMember = MapMember(memberMap, destinationMemberValue, resolvedValueVariable);
var mappedMember = MapMember(memberMap, resolvedValueVariable, destinationMemberValue);
var mappedMemberVariable = SetVariables(valueResolver, resolvedValueVariable, mappedMember);
var mapperExpr = destinationMemberReadOnly ? (Expression)mappedMemberVariable : Assign(destinationMemberAccess, mappedMemberVariable);
if (memberMap.Condition != null)
Expand Down Expand Up @@ -382,7 +382,7 @@ ParameterExpression SetVariables(Expression valueResolver, ParameterExpression r
}
return mappedMemberVariable;
}
Expression MapMember(MemberMap memberMap, Expression destinationMemberValue, ParameterExpression resolvedValue)
Expression MapMember(MemberMap memberMap, ParameterExpression resolvedValue, Expression destinationMemberValue)
{
var typePair = memberMap.Types();
var profile = _typeMap.Profile;
Expand Down
5 changes: 1 addition & 4 deletions src/AutoMapper/TypeMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,7 @@ public void Seal(IGlobalConfiguration configuration)
}
_sealed = true;
_details?.Seal(configuration, this);
if (!Projection)
{
MapExpression = CreateMapperLambda(configuration);
}
MapExpression = Projection ? EmptyLambda : CreateMapperLambda(configuration);
SourceTypeDetails = null;
DestinationTypeDetails = null;
}
Expand Down
31 changes: 30 additions & 1 deletion src/UnitTests/NullBehavior.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,34 @@
namespace AutoMapper.UnitTests.NullBehavior;

public class NullToExistingValue : AutoMapperSpecBase
{
private record Person
{
public string Name { get; set; }
public Address TheAddress { get; set; } = new();
}
private record Address
{
public string Street { get; set; }
public int Number { get; set; }
}
private record PersonModel
{
public string Name { get; set; }
public AddressModel TheAddress { get; set; }
}
private record AddressModel
{
public string Street { get; set; }
public int Number { get; set; }
}
protected override MapperConfiguration CreateConfiguration() => new(c =>
{
c.CreateMap<PersonModel, Person>();
c.CreateMap<AddressModel, Address>();
});
[Fact]
public void Should_overwrite() => Mapper.Map(new PersonModel(), new Person()).TheAddress.ShouldBeNull();
}
public class NullCheckDefault : AutoMapperSpecBase
{
class Source
Expand Down