private static object ConvertValueImpl(object value, Type targetType, out XamlConvertException exception) { try { exception = null; // Target type is undefined or type of object if (targetType == null || targetType == typeof(object)) { return(value); } // Unset or null value if (value == null || value.IsUnset()) { return(targetType.CreateDefaultValue()); } var valueType = value.GetType(); // No conversion is needed if (targetType.IsAssignableFrom(valueType)) { return(value); } // Primitive converter var primitiveConverter = value.GetConverter(targetType); if (primitiveConverter != null) { return(primitiveConverter.Convert(value, CultureInfo.InvariantCulture)); } var typeDescriptorContext = DummyTypeDescriptorContext.TypeDescriptorInstance; // Target Type converter var converter = TypeConversionUtil.GetTypeConverter(targetType); if (converter?.CanConvertFrom(typeDescriptorContext, valueType) == true) { return(converter.ConvertFrom(typeDescriptorContext, CultureInfo.InvariantCulture, value)); } // Source Type converter converter = TypeConversionUtil.GetTypeConverter(valueType); if (converter?.CanConvertTo(typeDescriptorContext, targetType) == true) { return(converter.ConvertTo(typeDescriptorContext, CultureInfo.InvariantCulture, value, targetType)); } // Xaml converter converter = XamlTypeConverter.GetConverter(targetType); if (converter?.CanConvertFrom(typeDescriptorContext, valueType) == true) { return(converter.ConvertFrom(typeDescriptorContext, CultureInfo.InvariantCulture, value)); } exception = CreateException(value, targetType, $"Can not convert value '{value}' to type {targetType}"); } catch (Exception e) { exception = CreateException(value, targetType, e); } return(null); }