Skip to content

Commit 23a5089

Browse files
committed
fix IgnoreNullValues for RecordType when used Map mapping
1 parent 892c42f commit 23a5089

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

src/Mapster/Adapters/RecordTypeAdapter.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ internal class RecordTypeAdapter : ClassAdapter
1515
protected override int Score => -149;
1616
protected override bool UseTargetValue => false;
1717

18+
private List<MemberMapping> SkipIgnoreNullValuesMemberMap = new List<MemberMapping>();
19+
1820
protected override bool CanMap(PreCompileArgument arg)
1921
{
2022
return arg.DestinationType.IsRecordType();
@@ -33,6 +35,7 @@ protected override Expression CreateInstantiationExpression(Expression source, E
3335
{
3436
//new TDestination(src.Prop1, src.Prop2)
3537

38+
SkipIgnoreNullValuesMemberMap.Clear();
3639
Expression installExpr;
3740

3841
if (arg.GetConstructUsing() != null || arg.DestinationType == null)
@@ -83,8 +86,14 @@ protected override Expression CreateInstantiationExpression(Expression source, E
8386

8487
var adapt = CreateAdaptExpression(member.Getter, member.DestinationMember.Type, arg, member);
8588

86-
if (arg.MapType == MapType.MapToTarget && arg.Settings.IgnoreNullValues == true && member.Getter.CanBeNull()) // add IgnoreNullValues support
89+
if (arg.Settings.IgnoreNullValues == true && member.Getter.CanBeNull()) // add IgnoreNullValues support
8790
{
91+
if (arg.MapType != MapType.MapToTarget)
92+
{
93+
SkipIgnoreNullValuesMemberMap.Add(member);
94+
continue;
95+
}
96+
8897
if (adapt is ConditionalExpression condEx)
8998
{
9099
if (condEx.Test is BinaryExpression { NodeType: ExpressionType.Equal } binEx &&
@@ -160,6 +169,29 @@ protected override Expression CreateBlockExpression(Expression source, Expressio
160169

161170
var lines = new List<Expression>();
162171

172+
if (arg.MapType != MapType.MapToTarget)
173+
{
174+
foreach (var member in SkipIgnoreNullValuesMemberMap)
175+
{
176+
177+
var adapt = CreateAdaptExpression(member.Getter, member.DestinationMember.Type, arg, member);
178+
179+
if (adapt is ConditionalExpression condEx)
180+
{
181+
if (condEx.Test is BinaryExpression { NodeType: ExpressionType.Equal } binEx &&
182+
binEx.Left == member.Getter &&
183+
binEx.Right is ConstantExpression { Value: null })
184+
adapt = condEx.IfFalse;
185+
}
186+
adapt = member.DestinationMember.SetExpression(destination, adapt);
187+
var sourceCondition = Expression.NotEqual(member.Getter, Expression.Constant(null, member.Getter.Type));
188+
189+
190+
lines.Add(Expression.IfThen(sourceCondition, adapt));
191+
}
192+
}
193+
194+
163195
foreach (var member in members)
164196
{
165197
if (member.DestinationMember.SetterModifier == AccessModifier.None && member.UseDestinationValue)

0 commit comments

Comments
 (0)