@@ -14,11 +14,13 @@ public class IgnoreMappingAttribute : Attribute {}
1414 private struct GetFieldDelegate
1515 {
1616 public delegate * < S , object > Del ;
17+ public Type FieldType ;
1718 }
1819
1920 private struct SetFieldDelegate
2021 {
2122 public delegate * < D , object , void > Del ;
23+ public Type FieldType ;
2224 }
2325
2426 private static Dictionary < string , GetFieldDelegate > _accessors = null ;
@@ -39,7 +41,11 @@ private static Dictionary<string, GetFieldDelegate> FieldAccessors
3941 if ( field . FieldType . IsValueType )
4042 il . Emit ( OpCodes . Box ) ;
4143 il . Emit ( OpCodes . Ret ) ;
42- _accessors . Add ( field . Name , new GetFieldDelegate { Del = ( delegate * < S , object > ) accessor . Generate ( ) . MethodHandle . GetFunctionPointer ( ) } ) ;
44+ _accessors . Add ( field . Name , new GetFieldDelegate
45+ {
46+ Del = ( delegate * < S , object > ) accessor . Generate ( ) . MethodHandle . GetFunctionPointer ( ) ,
47+ FieldType = field . FieldType
48+ } ) ;
4349 }
4450 }
4551 return _accessors ;
@@ -62,18 +68,22 @@ private static Dictionary<string, SetFieldDelegate> FieldSetters
6268 var il = setter . GetILProcessor ( ) ;
6369 il . Emit ( OpCodes . Ldarg_0 ) ;
6470 il . Emit ( OpCodes . Ldarg_1 ) ;
65- if ( field . FieldType . GetGenericTypeDefinition ( ) == typeof ( Nullable < > ) )
71+ if ( FieldAccessors . TryGetValue ( field . Name , out var getter ) && getter . FieldType . GetGenericTypeDefinition ( ) == typeof ( Nullable < > ) && getter . FieldType . GetGenericArguments ( ) [ 0 ] == field . FieldType )
6672 {
6773 il . Emit ( OpCodes . Call , AccessTools . DeclaredPropertyGetter ( fieldType , "Value" ) ) ;
68- fieldType = fieldType . GetGenericArguments ( ) [ 0 ] ;
74+ fieldType = getter . FieldType . GetGenericArguments ( ) [ 0 ] ;
6975 }
7076 else if ( fieldType . IsValueType )
7177 il . Emit ( OpCodes . Unbox , setter . Module . ImportReference ( field . FieldType ) ) ;
7278 else
7379 il . Emit ( OpCodes . Castclass , setter . Module . ImportReference ( field . FieldType ) ) ;
7480 il . Emit ( OpCodes . Stfld , setter . Module . ImportReference ( field ) ) ;
7581 il . Emit ( OpCodes . Ret ) ;
76- _setters . Add ( field . Name , new SetFieldDelegate { Del = ( delegate * < D , object , void > ) setter . Generate ( ) . MethodHandle . GetFunctionPointer ( ) } ) ;
82+ _setters . Add ( field . Name , new SetFieldDelegate
83+ {
84+ Del = ( delegate * < D , object , void > ) setter . Generate ( ) . MethodHandle . GetFunctionPointer ( ) ,
85+ FieldType = field . FieldType
86+ } ) ;
7787 }
7888 }
7989 return _setters ;
0 commit comments