il.Emit(OpCodes.Ldtoken,Nullable.GetUnderlyingType(unboxType)??unboxType);// stack is now [target][target][value][member-type-token]
il.Emit(OpCodes.Ldtoken,nullUnderlyingType??unboxType);// stack is now [target][target][value][member-type-token]
il.EmitCall(OpCodes.Call,typeof(Type).GetMethod("GetTypeFromHandle"),null);// stack is now [target][target][value][member-type]
il.EmitCall(OpCodes.Call,typeof(Convert).GetMethod("ChangeType",newType[]{typeof(object),typeof(Type)}),null);// stack is now [target][target][boxed-member-type-value]
il.Emit(OpCodes.Unbox_Any,unboxType);// stack is now [target][target][typed-value]
il.Emit(OpCodes.Unbox_Any,nullUnderlyingType??unboxType);// stack is now [target][target][typed-value]
}
}
if(nullUnderlyingType!=null)
{
il.Emit(OpCodes.Newobj,unboxType.GetConstructor(new[]{nullUnderlyingType}));// stack is now [target][target][typed-value]