internal static Tuple <Type, Type> GetTypeConverter(Type fromType, PropertyInfo property, IEntityMap entityMap) { if (entityMap != null) { var propertyMap = entityMap.Properties.FirstOrDefault(p => p.Property.PropertyName == property.Name); if (propertyMap != null) { var typeConverter = propertyMap.Property.Converter; if (typeConverter != null) { TypeConverterAttribute.ValidateTypeConverterType(typeConverter, fromType, property.PropertyType); return(Tuple.Create(typeConverter, TypeConverterAttribute.GetExpectedConverterInterfaceType(fromType, property.PropertyType))); } } } return(TypeConverterAttribute.GetTypeConverter(fromType, property)); }
private static Tuple <Type, Type> MatchTypeConverter(Type targetType, ReflectedProperty property, Type fromType, Tuple <Type, Type> typeConverter, bool autoTypeCoercion) { if (typeConverter.Item1 == null && autoTypeCoercion) { var interfaceType = typeConverter.Item2; if (interfaceType == null) { interfaceType = TypeConverterAttribute.GetExpectedConverterInterfaceType(fromType, property.PropertyType); } if (property.PropertyType == typeof(string)) { return(Tuple.Create(typeof(DBNullableStringConverter), interfaceType)); } else if (property.IsNullableType) { if (property.PropertyType.IsEnum) { var propertyType = property.PropertyType.GetEnumUnderlyingType(); return(Tuple.Create(typeof(NullableEnumConverter <>).MakeGenericType(propertyType), interfaceType)); } else { var propertyType = Nullable.GetUnderlyingType(property.PropertyType); return(Tuple.Create(typeof(DBNullableTypeConverter <>).MakeGenericType(propertyType), interfaceType)); } } else if (property.IsSimpleType && property.PropertyType.IsEnum) { return(Tuple.Create(typeof(EnumConverter <>).MakeGenericType(property.PropertyType), interfaceType)); } else if (property.PropertyType == typeof(byte[])) { return(Tuple.Create(typeof(DBNullableByteArrayConverter).MakeGenericType(property.PropertyType), interfaceType)); } } return(typeConverter); }