/// <summary> /// Convert source type value to destination type value using <see cref="TypeConverter"/> /// applied to destination type. /// </summary> /// <param name="sourceType">A type of an source member.</param> /// <param name="destinationType">A type of an destination member.</param> /// <param name="source">A source instance.</param> /// <returns>A value converted with type converter or <c>null</c>.</returns> private static object FromConverter(Type sourceType, Type destinationType, object source) { TypeConverter converter = TypeConverterCache.GetConverter(destinationType); object destination = null; if (converter != null) { if (converter.CanConvertFrom(sourceType)) { destination = converter.ConvertFrom(source); } else if (converter.CanConvertFrom(typeof(string))) { string str = source.ToString(); destination = converter.ConvertFromString(str); } } return(destination); }
/// <summary> /// Resolves type conversion between source and destination type. /// </summary> /// <returns>A possible conversion to try from source to destination type.</returns> public static TypeConversion Resolve(object sourceValue, Type sourceType, Type destinationType) { //// if types match or destination is assignable from source, direct assign is possible if (sourceType.Equals(destinationType) || destinationType.IsAssignableFrom(sourceType)) { return(TypeConversion.Direct); } //// if destination type is enum and source type is enum underlying type or string, //// enum conversion is possible if (destinationType.IsEnum && (EnumUtility.IsEnumType(sourceType) || sourceType.Equals(typeof(string)))) { return(TypeConversion.Enum); } //// if destination type has TypeConverter, then use that if (TypeConverterCache.HasConverter(destinationType)) { return(TypeConversion.Converter); } //// if source is IConvertible, use System.Convert.ChangeType if (CanChangeType(sourceValue, destinationType)) { return(TypeConversion.Convertable); } //// check if detination type has parsing methods if (ReflectionUtility.SupportsParsing(destinationType)) { //// try string parsing conversion return(TypeConversion.String); } return(TypeConversion.None); }