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)); } }
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)); } }