Exemple #1
0
        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);
        }