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); } }
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)); } }
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); } } }
static void Assert(ConvertTypeRequest request) { request.IsConverted.Should().BeFalse(); request.ConvertedValue.Should().BeNull(); }