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