@@ -1678,14 +1678,67 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
16781678 propertyOrFieldType = fieldInfo . FieldType ;
16791679 }
16801680
1681- // Call Promote and if that returns false, just try to convert the expression to the destination type using Expression.Convert
1682- var promoted = _parsingConfig . ExpressionPromoter . Promote ( expressions [ i ] , propertyOrFieldType , true , true ) ?? Expression . Convert ( expressions [ i ] , propertyOrFieldType ) ;
1683- memberBindings [ i ] = Expression . Bind ( memberInfo , promoted ) ;
1681+ // Call Promote and if that returns null, try to rebuild a nested MemberInitExpression for the target type,
1682+ // and if that also fails, try to convert the expression to the destination type using Expression.Convert.
1683+ var promoted = _parsingConfig . ExpressionPromoter . Promote ( expressions [ i ] , propertyOrFieldType , true , true ) ;
1684+ if ( promoted == null && expressions [ i ] is MemberInitExpression memberInitExpression )
1685+ {
1686+ promoted = TryRebuildMemberInitExpression ( memberInitExpression , propertyOrFieldType ) ;
1687+ }
1688+ memberBindings [ i ] = Expression . Bind ( memberInfo , promoted ?? Expression . Convert ( expressions [ i ] , propertyOrFieldType ) ) ;
16841689 }
16851690
16861691 return Expression . MemberInit ( Expression . New ( type ) , memberBindings ) ;
16871692 }
16881693
1694+ private static Expression ? TryRebuildMemberInitExpression ( MemberInitExpression memberInitExpression , Type targetType )
1695+ {
1696+ var defaultConstructor = targetType . GetConstructor ( Type . EmptyTypes ) ;
1697+ if ( defaultConstructor == null )
1698+ {
1699+ return null ;
1700+ }
1701+
1702+ var newBindings = new MemberBinding [ memberInitExpression . Bindings . Count ] ;
1703+ for ( var i = 0 ; i < memberInitExpression . Bindings . Count ; i ++ )
1704+ {
1705+ if ( memberInitExpression . Bindings [ i ] is not MemberAssignment assignment )
1706+ {
1707+ return null ;
1708+ }
1709+
1710+ var memberName = assignment . Member . Name ;
1711+ MemberInfo ? targetMember = targetType . GetProperty ( memberName ) ?? ( MemberInfo ? ) targetType . GetField ( memberName ) ;
1712+ if ( targetMember == null )
1713+ {
1714+ return null ;
1715+ }
1716+
1717+ var targetMemberType = targetMember is PropertyInfo targetPropertyInfo
1718+ ? targetPropertyInfo . PropertyType
1719+ : ( ( FieldInfo ) targetMember ) . FieldType ;
1720+
1721+ var bindingExpression = assignment . Expression ;
1722+ if ( bindingExpression is MemberInitExpression nestedMemberInit && bindingExpression . Type != targetMemberType )
1723+ {
1724+ var rebuilt = TryRebuildMemberInitExpression ( nestedMemberInit , targetMemberType ) ;
1725+ if ( rebuilt == null )
1726+ {
1727+ return null ;
1728+ }
1729+ bindingExpression = rebuilt ;
1730+ }
1731+ else if ( bindingExpression . Type != targetMemberType )
1732+ {
1733+ bindingExpression = Expression . Convert ( bindingExpression , targetMemberType ) ;
1734+ }
1735+
1736+ newBindings [ i ] = Expression . Bind ( targetMember , bindingExpression ) ;
1737+ }
1738+
1739+ return Expression . MemberInit ( Expression . New ( targetType ) , newBindings ) ;
1740+ }
1741+
16891742 private Expression ParseLambdaInvocation ( LambdaExpression lambda )
16901743 {
16911744 int errorPos = _textParser . CurrentToken . Pos ;
0 commit comments