Skip to content

Commit 1d38a0e

Browse files
committed
Determine if source is nullable, not destination
1 parent 6d3ce60 commit 1d38a0e

1 file changed

Lines changed: 14 additions & 4 deletions

File tree

TypeMapper.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)