public static void ReflectionWriteValue(XmlWriterDelegator xmlWriter, XmlObjectSerializerWriteContext context, Type type, object?value, bool writeXsiType, PrimitiveDataContract?primitiveContractForParamType) { Type memberType = type; object?memberValue = value; bool originValueIsNullableOfT = (memberType.IsGenericType && memberType.GetGenericTypeDefinition() == Globals.TypeOfNullable); if (memberType.IsValueType && !originValueIsNullableOfT) { Debug.Assert(memberValue != null); PrimitiveDataContract?primitiveContract = primitiveContractForParamType; if (primitiveContract != null && !writeXsiType) { primitiveContract.WriteXmlValue(xmlWriter, memberValue, context); } else { ReflectionInternalSerialize(xmlWriter, context, memberValue, memberValue.GetType().TypeHandle.Equals(memberType.TypeHandle), writeXsiType, memberType); } } else { if (originValueIsNullableOfT) { if (memberValue == null) { memberType = Nullable.GetUnderlyingType(memberType) !; } else { MethodInfo getValue = memberType.GetMethod("get_Value", Type.EmptyTypes) !; memberValue = getValue.Invoke(memberValue, Array.Empty <object>()) !; memberType = memberValue.GetType(); } } if (memberValue == null) { context.WriteNull(xmlWriter, memberType, DataContract.IsTypeSerializable(memberType)); } else { PrimitiveDataContract?primitiveContract = originValueIsNullableOfT ? PrimitiveDataContract.GetPrimitiveDataContract(memberType) : primitiveContractForParamType; if (primitiveContract != null && primitiveContract.UnderlyingType != Globals.TypeOfObject && !writeXsiType) { primitiveContract.WriteXmlValue(xmlWriter, memberValue, context); } else { if (memberValue == null && (memberType == Globals.TypeOfObject || (originValueIsNullableOfT && memberType.IsValueType))) { context.WriteNull(xmlWriter, memberType, DataContract.IsTypeSerializable(memberType)); } else { ReflectionInternalSerialize(xmlWriter, context, memberValue !, memberValue !.GetType().TypeHandle.Equals(memberType.TypeHandle), writeXsiType, memberType, originValueIsNullableOfT); } } } } }