@@ -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