Exemple #1
0
 private void EnsureConverter(Type sourceType, Type targetType)
 {
     if (this.sourceType != sourceType || this.targetType != targetType)
     {
         this.converter  = DefaultValueConverter.Create(sourceType, targetType, this.targetToSourceNeeded);
         this.sourceType = sourceType;
         this.targetType = targetType;
     }
 }
Exemple #2
0
        internal static IValueConverter Create(Type sourceType, Type targetType, bool targetToSource)
        {
            if (targetType == typeof(object))
            {
                return(new ObjectTargetConverter(sourceType));
            }
            if (sourceType == typeof(object))
            {
                return(new ObjectSourceConverter(targetType));
            }
            if (SystemConvertConverter.CanConvert(sourceType, targetType))
            {
                return(new SystemConvertConverter(sourceType, targetType));
            }
            Type underlyingType = Nullable.GetUnderlyingType(sourceType);

            if (underlyingType != null)
            {
                sourceType = underlyingType;
                return(DefaultValueConverter.Create(sourceType, targetType, targetToSource));
            }
            underlyingType = Nullable.GetUnderlyingType(targetType);
            if (underlyingType != null)
            {
                targetType = underlyingType;
                return(DefaultValueConverter.Create(sourceType, targetType, targetToSource));
            }
            if (sourceType.IsInterface || targetType.IsInterface)
            {
                return(new InterfaceConverter(sourceType, targetType));
            }
            TypeConverter converter    = DefaultValueConverter.GetConverter(sourceType);
            bool          canConvertTo = converter != null?converter.CanConvertTo(targetType) : false;

            bool canConvertFrom = converter != null?converter.CanConvertFrom(targetType) : false;

            if ((canConvertTo || targetType.IsAssignableFrom(sourceType)) && (!targetToSource || canConvertFrom || sourceType.IsAssignableFrom(targetType)))
            {
                return(new SourceDefaultValueConverter(converter, sourceType, targetType, !targetToSource ? false : canConvertFrom, canConvertTo));
            }
            converter    = DefaultValueConverter.GetConverter(targetType);
            canConvertTo = converter != null?converter.CanConvertTo(sourceType) : false;

            canConvertFrom = converter != null?converter.CanConvertFrom(sourceType) : false;

            if ((!canConvertFrom && !targetType.IsAssignableFrom(sourceType)) || (targetToSource && !canConvertTo && !sourceType.IsAssignableFrom(targetType)))
            {
                CultureInfo invariantCulture = CultureInfo.InvariantCulture;
                string      str      = "ValueConverter can't convert Type {0} to Type {1}";
                object[]    objArray = new object[] { sourceType.ToString(), targetType.ToString() };
                throw new InvalidOperationException(string.Format(invariantCulture, str, objArray));
            }
            return(new TargetDefaultValueConverter(converter, sourceType, targetType, canConvertFrom, !targetToSource ? false : canConvertTo));
        }