public object ConvertType(object value, Type conversionType, IFormatProvider provider)
        {
            var request = new ConvertTypeRequest(value, conversionType, provider);

            // Don't create unneccessary garbage; instantiate when the first Exception is caught.
            List <Exception> exceptions = null;

            foreach (var typeConverter in _typeConverters)
            {
                try
                {
                    typeConverter.Convert(request);

                    if (request.IsConverted)
                    {
                        return(request.ConvertedValue);
                    }
                }
                catch (Exception exception) { (exceptions ?? (exceptions = new List <Exception>())).Add(exception); }
            }

            if (exceptions?.Count > 0)
            {
                throw new AggregateException(exceptions);
            }
            else
            {
                throw new ArgumentException("TODO", nameof(conversionType));
            }
        }
        protected ConvertTypeRequest Convert(object value, Type conversionType, IFormatProvider provider)
        {
            var request = new ConvertTypeRequest(value, conversionType, provider);

            _typeConverter.Convert(request);

            return(request);
        }
        public void Convert(ConvertTypeRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (request.Value == null && request.ConversionTypeAllowsNull)
            {
                request.Converted(null);
            }
        }
        public void Convert(ConvertTypeRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            // All Nullable<T> instances box as their UnderlyingType.
            if (request.Value?.GetType() == request.ConversionType.FlattenGenericNullable())
            {
                request.Converted(request.Value);
            }
        }
Пример #5
0
        public void Convert(ConvertTypeRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            Type conversionType = request.ConversionType.FlattenGenericNullable();

            if (request.Value != null && request.Value.GetType().IsEnumUnderlyingType() && conversionType.IsEnum)
            {
                request.Converted(Enum.ToObject(conversionType, request.Value));
            }
        }
Пример #6
0
        public void Convert(ConvertTypeRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            // System.Convert.ChangeType requires that value implements IConvertible.
            // https://docs.microsoft.com/en-us/dotnet/api/system.convert.changetype?view=netstandard-2.0
            //
            // TODO : Check that ConversionType is supported by IConvertible.
            if ((request.Value == null && !request.ConversionType.IsValueType) || request.Value is IConvertible)
            {
                request.Converted(System.Convert.ChangeType(request.Value, request.ConversionType.FlattenGenericNullable(), request.Provider));
            }
        }
        public void Convert(ConvertTypeRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if ((request.Value as string)?.Length == 0)
            {
                if (request.ConversionType == typeof(string))
                {
                    request.Converted(request.Value);
                }
                else if (request.ConversionTypeAllowsNull)
                {
                    request.Converted(null);
                }
            }
        }
Пример #8
0
 static void Assert(ConvertTypeRequest request)
 {
     request.IsConverted.Should().BeFalse();
     request.ConvertedValue.Should().BeNull();
 }