Exemple #1
0
        public object Convert(object sourceValue, Type destinationType)
        {
            destinationType.CheckNotNull(nameof(destinationType));

            if (sourceValue == null)
            {
                if (destinationType.IsClassOrNullable())
                {
                    return(null);
                }
                else
                {
                    throw ConversionException.For(null, destinationType);
                }
            }

            Type underlyingDestinationType = Nullable.GetUnderlyingType(destinationType) ?? destinationType;
            Type sourceValueType           = sourceValue.GetType();

            if (destinationType.IsAssignableFrom(sourceValueType) || underlyingDestinationType.IsAssignableFrom(sourceValueType))
            {
                return(sourceValue);
            }
            if (destinationType.IsArray)
            {
                return(ConvertToArray(sourceValue, destinationType.GetElementType()));
            }
            if (TryConvertToEnumerable(sourceValue, destinationType, out object result))
            {
                return(result);
            }
            if (underlyingDestinationType.IsEnum)
            {
                return(ConvertToEnum(destinationType, sourceValue));
            }
            else if (underlyingDestinationType == typeof(TimeSpan))
            {
                return(ConvertToTimeSpan(sourceValue));
            }
            else if (destinationType == typeof(Type))
            {
                return(ConvertToType(sourceValue));
            }
            else
            {
                return(ConvertViaSystemConversion(sourceValue, underlyingDestinationType));
            }
        }
Exemple #2
0
 private Type ConvertToType(object value)
 {
     if (value is Type valueAsType)
     {
         return(valueAsType);
     }
     else if (value is string typeName)
     {
         Assembly[] assemblies = AssemblyFinder.FindAllByPattern(AssemblyNamePatternToFindTypes);
         return(TypeFinder.FindInAssemblies(typeName, assemblies));
     }
     else
     {
         throw ConversionException.For(value, typeof(Type));
     }
 }