@@ -1681,37 +1681,40 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
16811681 // Call Promote and if that returns null, try to rebuild a nested MemberInitExpression for the target type,
16821682 // and if that also fails, try to convert the expression to the destination type using Expression.Convert.
16831683 var promoted = _parsingConfig . ExpressionPromoter . Promote ( expressions [ i ] , propertyOrFieldType , true , true ) ;
1684- if ( promoted == null && expressions [ i ] is MemberInitExpression memberInitExpression )
1684+ if ( promoted == null && expressions [ i ] is MemberInitExpression memberInitExpression &&
1685+ TryRebuildMemberInitExpression ( memberInitExpression , propertyOrFieldType , out var rebuilt ) )
16851686 {
1686- promoted = TryRebuildMemberInitExpression ( memberInitExpression , propertyOrFieldType ) ;
1687+ promoted = rebuilt ;
16871688 }
16881689 memberBindings [ i ] = Expression . Bind ( memberInfo , promoted ?? Expression . Convert ( expressions [ i ] , propertyOrFieldType ) ) ;
16891690 }
16901691
16911692 return Expression . MemberInit ( Expression . New ( type ) , memberBindings ) ;
16921693 }
16931694
1694- private static Expression ? TryRebuildMemberInitExpression ( MemberInitExpression memberInitExpression , Type targetType )
1695+ private static bool TryRebuildMemberInitExpression ( MemberInitExpression memberInitExpression , Type targetType , [ NotNullWhen ( true ) ] out Expression ? expression )
16951696 {
1697+ expression = null ;
1698+
16961699 var defaultConstructor = targetType . GetConstructor ( Type . EmptyTypes ) ;
16971700 if ( defaultConstructor == null )
16981701 {
1699- return null ;
1702+ return false ;
17001703 }
17011704
17021705 var newBindings = new MemberBinding [ memberInitExpression . Bindings . Count ] ;
17031706 for ( var i = 0 ; i < memberInitExpression . Bindings . Count ; i ++ )
17041707 {
17051708 if ( memberInitExpression . Bindings [ i ] is not MemberAssignment assignment )
17061709 {
1707- return null ;
1710+ return false ;
17081711 }
17091712
17101713 var memberName = assignment . Member . Name ;
17111714 MemberInfo ? targetMember = targetType . GetProperty ( memberName ) ?? ( MemberInfo ? ) targetType . GetField ( memberName ) ;
17121715 if ( targetMember == null )
17131716 {
1714- return null ;
1717+ return false ;
17151718 }
17161719
17171720 var targetMemberType = targetMember is PropertyInfo targetPropertyInfo
@@ -1721,12 +1724,11 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
17211724 var bindingExpression = assignment . Expression ;
17221725 if ( bindingExpression is MemberInitExpression nestedMemberInit && bindingExpression . Type != targetMemberType )
17231726 {
1724- var rebuilt = TryRebuildMemberInitExpression ( nestedMemberInit , targetMemberType ) ;
1725- if ( rebuilt == null )
1727+ if ( ! TryRebuildMemberInitExpression ( nestedMemberInit , targetMemberType , out var rebuiltNested ) )
17261728 {
1727- return null ;
1729+ return false ;
17281730 }
1729- bindingExpression = rebuilt ;
1731+ bindingExpression = rebuiltNested ;
17301732 }
17311733 else if ( bindingExpression . Type != targetMemberType )
17321734 {
@@ -1736,7 +1738,8 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
17361738 newBindings [ i ] = Expression . Bind ( targetMember , bindingExpression ) ;
17371739 }
17381740
1739- return Expression . MemberInit ( Expression . New ( targetType ) , newBindings ) ;
1741+ expression = Expression . MemberInit ( Expression . New ( targetType ) , newBindings ) ;
1742+ return true ;
17401743 }
17411744
17421745 private Expression ParseLambdaInvocation ( LambdaExpression lambda )
0 commit comments