/// <summary>
        /// Processes the value.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <param name="context">The context.</param>
        /// <returns>
        /// The <see cref="object" /> representing the processed value.
        /// </returns>
        internal virtual object ProcessValue(
            object value,
            DittoProcessorContext context)
        {
            if (value != null && !ValueType.IsInstanceOfType(value))
            {
                throw new ArgumentException("Expected a value argument of type " + ValueType + " but got " + value.GetType(), "value");
            }

            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (!ContextType.IsInstanceOfType(context))
            {
                throw new ArgumentException("Expected a context argument of type " + ContextType + " but got " + context.GetType(), "context");
            }

            Value   = value;
            Context = context;

            var ctx = new DittoCacheContext(this, context.Content, context.TargetType, context.PropertyDescriptor, context.Culture);

            return(this.GetCacheItem(ctx, this.ProcessValue));
        }
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            if (_chainedConverter != null)
            {
                try { value = _chainedConverter.ConvertBack(value, typeof(object), parameter, culture); }
                catch (Exception e)
                {
                    EquationTokenizer.ThrowQuickConverterEvent(new ChainedConverterExceptionEventArgs(ConvertExpression, value, typeof(object), parameter, culture, true, _chainedConverter, this, e));
                    return(new object[targetTypes.Length].Select(o => value).ToArray());
                }

                if (value == DependencyProperty.UnsetValue || value == System.Windows.Data.Binding.DoNothing)
                {
                    return(new object[targetTypes.Length].Select(o => value).ToArray());
                }
            }

            object[] ret = new object[_convertBack.Length];

            if (ValueType != null && !ValueType.IsInstanceOfType(value))
            {
                for (int i = 0; i < ret.Length; ++i)
                {
                    ret[i] = System.Windows.Data.Binding.DoNothing;
                }
                return(ret);
            }

            for (int i = 0; i < _convertBack.Length; ++i)
            {
                try { ret[i] = _convertBack[i](value, _values); }
                catch (Exception e)
                {
                    LastException = e;
                    ++ExceptionCount;
                    if (Debugger.IsAttached)
                    {
                        Console.WriteLine("QuickMultiConverter Exception (\"" + ConvertBackExpression[i] + "\") - " + e.Message + (e.InnerException != null ? " (Inner - " + e.InnerException.Message + ")" : ""));
                    }
                    EquationTokenizer.ThrowQuickConverterEvent(new RuntimeMultiConvertExceptionEventArgs(ConvertBackExpression[i], ConvertBackExpressionDebugView[i], null, _pIndices, value, _values, parameter, this, e));
                    ret[i] = DependencyProperty.UnsetValue;
                }
                ret[i] = CastResult(ret[i], targetTypes[i]);
            }
            if (_fromDataContainers != null)
            {
                foreach (var container in _fromDataContainers)
                {
                    container.Value = null;
                }
            }
            return(ret);
        }
Пример #3
0
 protected object DeserializeOneOrPass(object value) => ValueType.IsInstanceOfType(value)
     ? value
     : DeserializeOne((string)value);
Пример #4
0
 public override bool IsValid(object val) => IsNullable && val == null || ValueType.IsInstanceOfType(val);
Пример #5
0
        private object DoConversion(object value, Type targetType, object parameter, Func <object, object[], object, object> func, bool convertingBack, CultureInfo culture)
        {
            if (convertingBack)
            {
                if (_chainedConverter != null)
                {
                    try { value = _chainedConverter.ConvertBack(value, targetType, parameter, culture); }
                    catch (Exception e)
                    {
                        EquationTokenizer.ThrowQuickConverterEvent(new ChainedConverterExceptionEventArgs(ConvertExpression, value, targetType, parameter, culture, true, _chainedConverter, this, e));
                        return(DependencyProperty.UnsetValue);
                    }

                    if (value == DependencyProperty.UnsetValue || value == System.Windows.Data.Binding.DoNothing)
                    {
                        return(value);
                    }
                }

                if (ValueType != null && !ValueType.IsInstanceOfType(value))
                {
                    return(System.Windows.Data.Binding.DoNothing);
                }
            }
            else
            {
                if (value == DependencyProperty.UnsetValue || _namedObjectType.IsInstanceOfType(value) || (PType != null && !PType.IsInstanceOfType(value)))
                {
                    return(DependencyProperty.UnsetValue);
                }
            }

            object result = value;

            if (func != null)
            {
                try { result = func(result, _values, parameter); }
                catch (Exception e)
                {
                    LastException = e;
                    ++ExceptionCount;
                    if (Debugger.IsAttached)
                    {
                        Console.WriteLine("QuickMultiConverter Exception (\"" + (convertingBack ? ConvertBackExpression : ConvertExpression) + "\") - " + e.Message + (e.InnerException != null ? " (Inner - " + e.InnerException.Message + ")" : ""));
                    }
                    if (convertingBack)
                    {
                        EquationTokenizer.ThrowQuickConverterEvent(new RuntimeSingleConvertExceptionEventArgs(ConvertBackExpression, ConvertBackExpressionDebugView, null, value, _values, parameter, this, e));
                    }
                    else
                    {
                        EquationTokenizer.ThrowQuickConverterEvent(new RuntimeSingleConvertExceptionEventArgs(ConvertExpression, ConvertExpressionDebugView, value, null, _values, parameter, this, e));
                    }
                    return(DependencyProperty.UnsetValue);
                }
                finally
                {
                    var dataContainers = convertingBack ? _fromDataContainers : _toDataContainers;
                    if (dataContainers != null)
                    {
                        foreach (var container in dataContainers)
                        {
                            container.Value = null;
                        }
                    }
                }
            }

            if (result == DependencyProperty.UnsetValue || result == System.Windows.Data.Binding.DoNothing)
            {
                return(result);
            }

            if (!convertingBack && _chainedConverter != null)
            {
                try { result = _chainedConverter.Convert(result, targetType, parameter, culture); }
                catch (Exception e)
                {
                    EquationTokenizer.ThrowQuickConverterEvent(new ChainedConverterExceptionEventArgs(ConvertExpression, result, targetType, parameter, culture, false, _chainedConverter, this, e));
                    return(DependencyProperty.UnsetValue);
                }
            }

            if (result == DependencyProperty.UnsetValue || result == System.Windows.Data.Binding.DoNothing || result == null || targetType == null || targetType == typeof(object))
            {
                return(result);
            }

            if (targetType == typeof(string))
            {
                return(result.ToString());
            }

            Func <object, object> cast;

            if (!castFunctions.TryGetValue(targetType, out cast))
            {
                ParameterExpression par = Expression.Parameter(typeof(object));
                cast = Expression.Lambda <Func <object, object> >(Expression.Convert(Expression.Dynamic(Binder.Convert(CSharpBinderFlags.ConvertExplicit, targetType, typeof(object)), targetType, par), typeof(object)), par).Compile();
                castFunctions.TryAdd(targetType, cast);
            }
            if (cast != null)
            {
                try
                {
                    result = cast(result);
                }
                catch
                {
                    castFunctions[targetType] = null;
                }
            }
            return(result);
        }
 public bool IsValid(object value) => IsNullable && value == null || ValueType.IsInstanceOfType(value);