Example #1
0
        // cache of default converters (so that all uses of string-to-int can
        // share the same converter)
        internal IValueConverter GetDefaultValueConverter(Type sourceType,
                                                          Type targetType,
                                                          bool targetToSource)
        {
            IValueConverter result = _valueConverterTable[sourceType, targetType, targetToSource];

            if (result == null)
            {
                result = DefaultValueConverter.Create(sourceType, targetType, targetToSource, this);
                if (result != null)
                {
                    _valueConverterTable.Add(sourceType, targetType, targetToSource, result);
                }
            }

            return(result);
        }
Example #2
0
        // Token: 0x060074D2 RID: 29906 RVA: 0x00216A6C File Offset: 0x00214C6C
        internal static IValueConverter Create(Type sourceType, Type targetType, bool targetToSource, DataBindEngine engine)
        {
            bool flag  = false;
            bool flag2 = false;

            if (sourceType == targetType || (!targetToSource && targetType.IsAssignableFrom(sourceType)))
            {
                return(DefaultValueConverter.ValueConverterNotNeeded);
            }
            if (targetType == typeof(object))
            {
                return(new ObjectTargetConverter(sourceType, engine));
            }
            if (sourceType == typeof(object))
            {
                return(new ObjectSourceConverter(targetType, engine));
            }
            if (SystemConvertConverter.CanConvert(sourceType, targetType))
            {
                return(new SystemConvertConverter(sourceType, targetType));
            }
            Type underlyingType = Nullable.GetUnderlyingType(sourceType);

            if (underlyingType != null)
            {
                sourceType = underlyingType;
                flag       = true;
            }
            underlyingType = Nullable.GetUnderlyingType(targetType);
            if (underlyingType != null)
            {
                targetType = underlyingType;
                flag2      = true;
            }
            if (flag || flag2)
            {
                return(DefaultValueConverter.Create(sourceType, targetType, targetToSource, engine));
            }
            if (typeof(IListSource).IsAssignableFrom(sourceType) && targetType.IsAssignableFrom(typeof(IList)))
            {
                return(new ListSourceConverter());
            }
            if (sourceType.IsInterface || targetType.IsInterface)
            {
                return(new InterfaceConverter(sourceType, targetType));
            }
            TypeConverter converter = DefaultValueConverter.GetConverter(sourceType);
            bool          flag3     = converter != null && converter.CanConvertTo(targetType);
            bool          flag4     = converter != null && converter.CanConvertFrom(targetType);

            if ((flag3 || targetType.IsAssignableFrom(sourceType)) && (!targetToSource || flag4 || sourceType.IsAssignableFrom(targetType)))
            {
                return(new SourceDefaultValueConverter(converter, sourceType, targetType, targetToSource && flag4, flag3, engine));
            }
            converter = DefaultValueConverter.GetConverter(targetType);
            flag3     = (converter != null && converter.CanConvertTo(sourceType));
            flag4     = (converter != null && converter.CanConvertFrom(sourceType));
            if ((flag4 || targetType.IsAssignableFrom(sourceType)) && (!targetToSource || flag3 || sourceType.IsAssignableFrom(targetType)))
            {
                return(new TargetDefaultValueConverter(converter, sourceType, targetType, flag4, targetToSource && flag3, engine));
            }
            return(null);
        }
Example #3
0
        // Token: 0x060074D8 RID: 29912 RVA: 0x00216DAC File Offset: 0x00214FAC
        private object ConvertHelper(object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, bool isForward)
        {
            object obj  = DependencyProperty.UnsetValue;
            bool   flag = isForward ? (!this._shouldConvertTo) : (!this._shouldConvertFrom);
            NotSupportedException ex = null;

            if (!flag)
            {
                obj = DefaultValueConverter.TryParse(o, destinationType, culture);
                if (obj == DependencyProperty.UnsetValue)
                {
                    ValueConverterContext valueConverterContext = this.Engine.ValueConverterContext;
                    if (valueConverterContext.IsInUse)
                    {
                        valueConverterContext = new ValueConverterContext();
                    }
                    try
                    {
                        valueConverterContext.SetTargetElement(targetElement);
                        if (isForward)
                        {
                            obj = this._typeConverter.ConvertTo(valueConverterContext, culture, o, destinationType);
                        }
                        else
                        {
                            obj = this._typeConverter.ConvertFrom(valueConverterContext, culture, o);
                        }
                    }
                    catch (NotSupportedException ex2)
                    {
                        flag = true;
                        ex   = ex2;
                    }
                    finally
                    {
                        valueConverterContext.SetTargetElement(null);
                    }
                }
            }
            if (flag && ((o != null && destinationType.IsAssignableFrom(o.GetType())) || (o == null && !destinationType.IsValueType)))
            {
                obj  = o;
                flag = false;
            }
            if (TraceData.IsEnabled)
            {
                if (culture != null && ex != null)
                {
                    TraceData.Trace(TraceEventType.Error, TraceData.DefaultValueConverterFailedForCulture(new object[]
                    {
                        AvTrace.ToStringHelper(o),
                        AvTrace.TypeName(o),
                        destinationType.ToString(),
                        culture
                    }), ex);
                }
                else if (flag)
                {
                    TraceData.Trace(TraceEventType.Error, TraceData.DefaultValueConverterFailed(new object[]
                    {
                        AvTrace.ToStringHelper(o),
                        AvTrace.TypeName(o),
                        destinationType.ToString()
                    }), ex);
                }
            }
            if (flag && ex != null)
            {
                throw ex;
            }
            return(obj);
        }