@@ -15,6 +15,8 @@ internal class RecordTypeAdapter : ClassAdapter
15
15
protected override int Score => - 149 ;
16
16
protected override bool UseTargetValue => false ;
17
17
18
+ private List < MemberMapping > SkipIgnoreNullValuesMemberMap = new List < MemberMapping > ( ) ;
19
+
18
20
protected override bool CanMap ( PreCompileArgument arg )
19
21
{
20
22
return arg . DestinationType . IsRecordType ( ) ;
@@ -33,6 +35,7 @@ protected override Expression CreateInstantiationExpression(Expression source, E
33
35
{
34
36
//new TDestination(src.Prop1, src.Prop2)
35
37
38
+ SkipIgnoreNullValuesMemberMap . Clear ( ) ;
36
39
Expression installExpr ;
37
40
38
41
if ( arg . GetConstructUsing ( ) != null || arg . DestinationType == null )
@@ -83,8 +86,14 @@ protected override Expression CreateInstantiationExpression(Expression source, E
83
86
84
87
var adapt = CreateAdaptExpression ( member . Getter , member . DestinationMember . Type , arg , member ) ;
85
88
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
87
90
{
91
+ if ( arg . MapType != MapType . MapToTarget )
92
+ {
93
+ SkipIgnoreNullValuesMemberMap . Add ( member ) ;
94
+ continue ;
95
+ }
96
+
88
97
if ( adapt is ConditionalExpression condEx )
89
98
{
90
99
if ( condEx . Test is BinaryExpression { NodeType : ExpressionType . Equal } binEx &&
@@ -160,6 +169,29 @@ protected override Expression CreateBlockExpression(Expression source, Expressio
160
169
161
170
var lines = new List < Expression > ( ) ;
162
171
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
+
163
195
foreach ( var member in members )
164
196
{
165
197
if ( member . DestinationMember . SetterModifier == AccessModifier . None && member . UseDestinationValue )
0 commit comments