繁体   English   中英

转换 System.InvalidCastException 时出错:对象必须实现 IConvertible

[英]Error on conversion System.InvalidCastException: Object must implement IConvertible

我正在尝试创建一个自定义模型绑定器,它可以正确解析传入的请求。 传入的请求在表单中。

https://localhost:5001/api/hotel?filter=name~contains~'hotel'&page=1&pageSize=5

在控制器中,我将模型绑定器用作:

[HttpGet]
public async Task<DataSourceResult> GetHotel([ModelBinder(BinderType = typeof(GridDataSourceRequestModelBinder))] DataSourceRequest request)
{

GridDataSourceRequestModelBinder看起来像:

public async Task BindModelAsync(ModelBindingContext bindingContext)
{
    if (bindingContext.ModelType != typeof(DataSourceRequest))
    {
        return;
    }
    var request = CreateDataSourceRequest(bindingContext.ModelMetadata, bindingContext.ValueProvider, bindingContext.ModelName);

    bindingContext.Result = ModelBindingResult.Success(request);
}

DataSourceRequest请求

public class DataSourceRequest
{
    public DataSourceRequest();

    public int Page { get; set; }
    public int PageSize { get; set; }
    public IList<SortDescriptor> Sorts { get; set; }
    public IList<IFilterDescriptor> Filters { get; set; }
    public IList<GroupDescriptor> Groups { get; set; }
    public IList<AggregateDescriptor> Aggregates { get; set; }
}

CreateDataSourceRequest 方法:

public static DataSourceRequest CreateDataSourceRequest(ModelMetadata modelMetadata, IValueProvider valueProvider, string modelName)
{
    var request = new DataSourceRequest();

    TryGetValue(modelMetadata, valueProvider, modelName, DataSourceRequestUrlParameters.Page, (int currentPage) => request.Page = currentPage);

    TryGetValue(modelMetadata, valueProvider, modelName, DataSourceRequestUrlParameters.PageSize, (int pageSize) => request.PageSize = pageSize);

    TryGetValue(modelMetadata, valueProvider, modelName, DataSourceRequestUrlParameters.Filter, (string filter) =>
        request.Filters = FilterDescriptorFactory.Create(filter)
    );

    return request;
}

TryGetValue方法中,我有以下代码。

private static void TryGetValue<T>(ModelMetadata modelMetadata, IValueProvider valueProvider, string modelName, string key, Action<T> action)
{
    if (modelMetadata.BinderModelName.HasValue())
    {
        key = modelName + "-" + key;
    }

    var value = valueProvider.GetValue(key);
    if (value.FirstValue != null)
    {
        //Type typeParameterType = typeof(T);

        var convertedValue = TypeDescriptor.GetConverter(typeof(T)).ConvertTo(value, typeof(T));

        if (convertedValue != null)
        {
            action((T)convertedValue);
        }
    }
}

在下面的代码中转换 typeof(T) 时,

var convertedValue = TypeDescriptor.GetConverter(typeof(T)).ConvertTo(value, typeof(T));

我收到的错误是:

System.InvalidCastException: Object must implement IConvertible.

将值转换为类型(T)时我缺少什么?

附加类:

public static class DataSourceRequestUrlParameters
{
    public static string Aggregates { get; set; }
    public static string Filter { get; set; }
    public static string Page { get; set; }
    public static string PageSize { get; set; }
    public static string Sort { get; set; }
    public static string Group { get; set; }
    public static string Mode { get; set; }

    public static IDictionary<string, string> ToDictionary(string prefix);
}

我一直在尝试转换IValueProvider类型的值,所以它给了我一个错误。

所以,我必须使用value.FirstValue而不是那个。

现在它变成了:

var convertedValue = TypeDescriptor.GetConverter(typeof(T)).ConvertTo(value.FirstValue, typeof(T));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM