/// <summary> /// 从特性中获取转换器 /// </summary> /// <param name="converterAttribute">特性</param> /// <param name="typeToConvert">待转换类型</param> /// <param name="classTypeAttributeIsOn">所属类型</param> /// <param name="memberInfo">成员信息</param> /// <returns></returns> private BinaryConverter GetConverterFromAttribute(BinaryConverterAttribute converterAttribute, Type typeToConvert, Type classTypeAttributeIsOn, MemberInfo memberInfo) { BinaryConverter converter; // 如果转换器特性的ConverterType为空,则尝试使用特性的CreateConverter方法来创建 Type type = converterAttribute.ConverterType; if (type == null) { // Allow the attribute to create the converter. converter = converterAttribute.CreateConverter(typeToConvert); if (converter == null) { ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeNotCompatible(classTypeAttributeIsOn, memberInfo, typeToConvert); } } else { ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes); // ConvertType必须是BinaryConverter的子类,并且具有无参数公共构造 if (!typeof(BinaryConverter).IsAssignableFrom(type) || ctor == null || !ctor.IsPublic) { ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeInvalid(classTypeAttributeIsOn, memberInfo); } converter = (BinaryConverter)Activator.CreateInstance(type) !; } Debug.Assert(converter != null); if (!converter.CanConvert(typeToConvert)) { Type underlyingType = Nullable.GetUnderlyingType(typeToConvert); if (underlyingType != null && converter.CanConvert(underlyingType)) { if (converter is BinaryConverterFactory converterFactory) { converter = converterFactory.GetConverterInternal(underlyingType, this); } // Allow nullable handling to forward to the underlying type's converter. return(NullableConverterFactory.CreateValueConverter(underlyingType, converter)); } ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeNotCompatible(classTypeAttributeIsOn, memberInfo, typeToConvert); } return(converter); }
private static JsonConverter GetConverterFromAttribute(JsonConverterAttribute converterAttribute, Type typeToConvert, MemberInfo?memberInfo, JsonSerializerOptions options) { JsonConverter?converter; Type declaringType = memberInfo?.DeclaringType ?? typeToConvert; Type?converterType = converterAttribute.ConverterType; if (converterType == null) { // Allow the attribute to create the converter. converter = converterAttribute.CreateConverter(typeToConvert); if (converter == null) { ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeNotCompatible(declaringType, memberInfo, typeToConvert); } } else { ConstructorInfo?ctor = converterType.GetConstructor(Type.EmptyTypes); if (!typeof(JsonConverter).IsAssignableFrom(converterType) || ctor == null || !ctor.IsPublic) { ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeInvalid(declaringType, memberInfo); } converter = (JsonConverter)Activator.CreateInstance(converterType) !; } Debug.Assert(converter != null); if (!converter.CanConvert(typeToConvert)) { Type?underlyingType = Nullable.GetUnderlyingType(typeToConvert); if (underlyingType != null && converter.CanConvert(underlyingType)) { if (converter is JsonConverterFactory converterFactory) { converter = converterFactory.GetConverterInternal(underlyingType, options); } // Allow nullable handling to forward to the underlying type's converter. return(NullableConverterFactory.CreateValueConverter(underlyingType, converter)); } ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeNotCompatible(declaringType, memberInfo, typeToConvert); } return(converter); }
private JsonConverter GetConverterFromAttribute(JsonConverterAttribute converterAttribute, Type typeToConvert, Type classTypeAttributeIsOn, PropertyInfo?propertyInfo) { JsonConverter?converter; Type?type = converterAttribute.ConverterType; if (type == null) { // Allow the attribute to create the converter. converter = converterAttribute.CreateConverter(typeToConvert); if (converter == null) { ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeNotCompatible(classTypeAttributeIsOn, propertyInfo, typeToConvert); } } else { ConstructorInfo?ctor = type.GetConstructor(Type.EmptyTypes); if (!typeof(JsonConverter).IsAssignableFrom(type) || ctor == null || !ctor.IsPublic) { ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeInvalid(classTypeAttributeIsOn, propertyInfo); } converter = (JsonConverter)Activator.CreateInstance(type) !; } Debug.Assert(converter != null); if (!converter.CanConvert(typeToConvert)) { Type?underlyingType = Nullable.GetUnderlyingType(typeToConvert); if (underlyingType != null && converter.CanConvert(underlyingType)) { // Allow nullable handling to forward to the underlying type's converter. return(NullableConverterFactory.CreateValueConverter(underlyingType, converter)); } ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeNotCompatible(classTypeAttributeIsOn, propertyInfo, typeToConvert); } return(converter); }