@@ -845,12 +845,6 @@ private TConstruct EmitObjectUnpackFromCore( TContext context, SerializationTarg
845845#endif // FEATURE_TAP
846846 ;
847847
848- int constructorParameterIndex = 0 ;
849- var fieldNames =
850- targetInfo . IsConstructorDeserialization
851- ? targetInfo . DeserializationConstructor . GetParameters ( ) . Select ( p => p . Name ) . ToArray ( )
852- : targetInfo . Members . Where ( m => m . MemberName != null ) . Select ( m => m . MemberName ) . ToArray ( ) ;
853-
854848 for ( int i = 0 ; i < targetInfo . Members . Count ; i ++ )
855849 {
856850 var count = i ;
@@ -881,33 +875,16 @@ private TConstruct EmitObjectUnpackFromCore( TContext context, SerializationTarg
881875 }
882876 else
883877 {
878+ var name = targetInfo . Members [ count ] . MemberName ;
879+ Contract . Assert ( ! String . IsNullOrEmpty ( name ) , targetInfo . Members [ count ] + "@" + i + " does not have member name." ) ;
884880 var unpackedItem =
885881 context . DefineUnpackedItemParameterInSetValueMethods ( targetInfo . Members [ count ] . Member . GetMemberValueType ( ) ) ;
886882 Func < TConstruct > storeValueStatementEmitter ;
887- if ( unpackingContext . VariableType . TryGetRuntimeType ( ) == typeof ( DynamicUnpackingContext ) )
888- {
889- storeValueStatementEmitter =
890- ( ) =>
891- this . EmitInvokeVoidMethod (
892- context ,
893- context . UnpackingContextInSetValueMethods ,
894- Metadata . _DynamicUnpackingContext . Set ,
895- this . MakeStringLiteral ( context , fieldNames [ count ] ) ,
896- targetInfo . Members [ count ] . Member . GetMemberValueType ( ) . GetIsValueType ( )
897- ? this . EmitBoxExpression (
898- context ,
899- unpackedItem . ContextType ,
900- unpackedItem
901- ) : unpackedItem
902- ) ;
903- }
904- else if ( targetInfo . IsConstructorDeserialization || this . TargetType . GetIsValueType ( ) )
883+ if ( targetInfo . IsConstructorDeserialization || this . TargetType . GetIsValueType ( ) )
905884 {
906- var name = fieldNames [ constructorParameterIndex ] ;
907885 storeValueStatementEmitter =
908886 ( ) =>
909887 this . EmitSetField ( context , context . UnpackingContextInSetValueMethods , unpackingContext . Type , name , unpackedItem ) ;
910- constructorParameterIndex ++ ;
911888 }
912889 else
913890 {
@@ -1013,7 +990,7 @@ private UnpackingContextInfo EmitObjectUnpackingContextInitialization( TContext
1013990 {
1014991 var constructorParameters = targetInfo . DeserializationConstructor . GetParameters ( ) ;
1015992 var contextFields =
1016- constructorParameters . Select ( p => new KeyValuePair < string , TypeDefinition > ( p . Name , p . ParameterType ) ) . ToArray ( ) ;
993+ constructorParameters . Select ( ( p , i ) => new KeyValuePair < string , TypeDefinition > ( targetInfo . GetCorrespondingMemberName ( i ) ?? ( "__OrphanParameter" + i . ToString ( CultureInfo . InvariantCulture ) ) , p . ParameterType ) ) . ToArray ( ) ;
1017994 var constructorArguments = new List < TConstruct > ( constructorParameters . Length ) ;
1018995 var mappableConstructorArguments = new HashSet < string > ( ) ;
1019996 var initializationStatements =
@@ -1148,39 +1125,7 @@ IEnumerable<TConstruct> argumentInitializers
11481125 unpackingContext . Statements . AddRange ( argumentInitializers ) ;
11491126
11501127 unpackingContext . Statements . Add (
1151- unpackingContext . VariableType . TryGetRuntimeType ( ) == typeof ( DynamicUnpackingContext )
1152- ? this . EmitSequentialStatements (
1153- context ,
1154- TypeDefinition . VoidType ,
1155- new [ ]
1156- {
1157- this . EmitStoreVariableStatement (
1158- context ,
1159- unpackingContext . Variable ,
1160- this . EmitCreateNewObjectExpression (
1161- context ,
1162- unpackingContext . Variable ,
1163- unpackingContext . Constructor ,
1164- this . MakeInt32Literal ( context , constructorArguments . Count )
1165- )
1166- )
1167- } . Concat (
1168- constructorArguments . Select ( ( a , i ) =>
1169- this . EmitInvokeVoidMethod (
1170- context ,
1171- unpackingContext . Variable ,
1172- Metadata . _DynamicUnpackingContext . Set ,
1173- this . MakeStringLiteral ( context , contextFields [ i ] . Key ) ,
1174- a . ContextType . ResolveRuntimeType ( ) . GetIsValueType ( )
1175- ? this . EmitBoxExpression (
1176- context ,
1177- a . ContextType ,
1178- a
1179- ) : a
1180- )
1181- )
1182- )
1183- ) : this . EmitStoreVariableStatement (
1128+ this . EmitStoreVariableStatement (
11841129 context ,
11851130 unpackingContext . Variable ,
11861131 this . EmitCreateNewObjectExpression (
@@ -1224,26 +1169,15 @@ private IEnumerable<TConstruct> EmitCreateObjectFromContextCore(
12241169 context ,
12251170 result ,
12261171 member ,
1227- unpackingContext . VariableType . TryGetRuntimeType ( ) == typeof ( DynamicUnpackingContext )
1228- ? this . EmitUnboxAnyExpression (
1229- context ,
1230- field . Value ,
1231- this . EmitInvokeMethodExpression (
1232- context ,
1233- context . UnpackingContextInCreateObjectFromContext ,
1234- Metadata . _DynamicUnpackingContext . Get ,
1235- this . MakeStringLiteral ( context , field . Key )
1236- )
1237- )
1238- : this . EmitGetFieldExpression (
1239- context ,
1240- context . UnpackingContextInCreateObjectFromContext ,
1241- new FieldDefinition (
1242- unpackingContext . Type ,
1243- field . Key ,
1244- field . Value
1245- )
1172+ this . EmitGetFieldExpression (
1173+ context ,
1174+ context . UnpackingContextInCreateObjectFromContext ,
1175+ new FieldDefinition (
1176+ unpackingContext . Type ,
1177+ field . Key ,
1178+ field . Value
12461179 )
1180+ )
12471181 ) ;
12481182 }
12491183
@@ -1523,18 +1457,7 @@ private IEnumerable<TConstruct> EmitInvokeDeserializationConstructorStatementsCo
15231457 constructor ,
15241458 fields . Select (
15251459 f =>
1526- unpackingContext . ContextType . TryGetRuntimeType ( ) == typeof ( DynamicUnpackingContext )
1527- ? this . EmitUnboxAnyExpression (
1528- context ,
1529- f . Value ,
1530- this . EmitInvokeMethodExpression (
1531- context ,
1532- unpackingContext ,
1533- Metadata . _DynamicUnpackingContext . Get ,
1534- this . MakeStringLiteral ( context , f . Key )
1535- )
1536- )
1537- : this . EmitGetFieldExpression ( context , unpackingContext , new FieldDefinition ( unpackingContext . ContextType , f . Key , f . Value ) )
1460+ this . EmitGetFieldExpression ( context , unpackingContext , new FieldDefinition ( unpackingContext . ContextType , f . Key , f . Value ) )
15381461 ) . ToArray ( )
15391462 )
15401463 ) ;
0 commit comments