@@ -1351,20 +1351,34 @@ private Expression CreateNewExpression(List<DynamicProperty> properties, List<Ex
1351
1351
1352
1352
Type [ ] propertyTypes = propertyInfos . Select ( p => p . PropertyType ) . ToArray ( ) ;
1353
1353
ConstructorInfo ctor = type . GetConstructor ( propertyTypes ) ;
1354
- if ( ctor != null && ctor . GetParameters ( ) . Length == expressions . Count )
1354
+ if ( ctor != null )
1355
1355
{
1356
- var expressionsPromoted = new List < Expression > ( ) ;
1357
-
1358
- // Loop all expressions and promote if needed
1359
- for ( int i = 0 ; i < propertyTypes . Length ; i ++ )
1356
+ var ctorParameters = ctor . GetParameters ( ) ;
1357
+ if ( ctorParameters . Length == expressions . Count )
1360
1358
{
1361
- Type propertyType = propertyTypes [ i ] ;
1359
+ bool bindParametersSequentially = ! properties . All ( p => ctorParameters
1360
+ . Any ( cp => cp . Name == p . Name && ( cp . ParameterType == p . Type || p . Type == Nullable . GetUnderlyingType ( cp . ParameterType ) ) ) ) ;
1361
+ var expressionsPromoted = new List < Expression > ( ) ;
1362
+ // Loop all expressions and promote if needed
1363
+ for ( int i = 0 ; i < ctorParameters . Length ; i ++ )
1364
+ {
1365
+ if ( bindParametersSequentially )
1366
+ {
1367
+ expressionsPromoted . Add ( _parsingConfig . ExpressionPromoter . Promote ( expressions [ i ] , propertyTypes [ i ] , true , true ) ) ;
1368
+ }
1369
+ else
1370
+ {
1371
+ Type propertyType = ctorParameters [ i ] . ParameterType ;
1372
+ string cParameterName = ctorParameters [ i ] . Name ;
1373
+ var propertyAndIndex = properties . Select ( ( p , index ) => new { p , index } )
1374
+ . First ( p => p . p . Name == cParameterName && ( p . p . Type == propertyType || p . p . Type == Nullable . GetUnderlyingType ( propertyType ) ) ) ;
1375
+ // Promote from Type to Nullable Type if needed
1376
+ expressionsPromoted . Add ( _parsingConfig . ExpressionPromoter . Promote ( expressions [ propertyAndIndex . index ] , propertyType , true , true ) ) ;
1377
+ }
1378
+ }
1362
1379
1363
- // Promote from Type to Nullable Type if needed
1364
- expressionsPromoted . Add ( _parsingConfig . ExpressionPromoter . Promote ( expressions [ i ] , propertyType , true , true ) ) ;
1380
+ return Expression . New ( ctor , expressionsPromoted , ( IEnumerable < MemberInfo > ) propertyInfos ) ;
1365
1381
}
1366
-
1367
- return Expression . New ( ctor , expressionsPromoted , ( IEnumerable < MemberInfo > ) propertyInfos ) ;
1368
1382
}
1369
1383
1370
1384
MemberBinding [ ] bindings = new MemberBinding [ properties . Count ] ;
0 commit comments