【问题标题】:How to cast an object to a not known generic type?如何将对象转换为未知的泛型类型?
【发布时间】:2015-10-15 02:51:28
【问题描述】:

我想构建一个通用方法来调用许多 Web API,例如 Bing 地图。对于这个问题,我使用来自 Problem with deserializing JSON on datamember "__type" 的类,它运行良好。

我不完全知道如何将 ser.ReadObject(a.Result) 转换为我作为通用参数提供的类型,在本例中为 LocationQueryResponse。 p>

public static void GetResponse<TDataContract>(Uri uri, Action<TDataContract> callback)
            where TDataContract : IDataContract, new()
        {
            var contract = new TDataContract();
            var contractType = contract.GetType();

            var wc = new WebClient();
            wc.OpenReadCompleted += (o, a) =>
            {
                if (callback != null)
                {
                    var ser = new DataContractJsonSerializer(typeof(TDataContract));
                    callback(Convert.ChangeType(ser.ReadObject(a.Result), contractType));
                }
            };

            wc.OpenReadAsync(uri);
        }

现在我得到这个错误: 类型参数“TDataContract”不能与“as”运算符一起使用,因为它没有类类型约束,也没有“类”约束基础结构

每个与 Web API 通信的类都继承 IDataContract 接口。 有人可以帮忙吗?

谢谢,

大卫

【问题讨论】:

  • 你试过 where TDataContract: IDataContract, new(), class?虽然我认为您可能能够以更简单的方式做到这一点......
  • 有什么更简单的方法?
  • 如何使用适用于泛型的 JSON 序列化程序。可能是这个:msdn.microsoft.com/en-us/library/bb355316(v=vs.110).aspx
  • 好主意,我试试看。

标签: c# asp.net-mvc webclient


【解决方案1】:

我会在进行回调时对类型进行实际转换,无需转换类型,因为您已使用序列化程序读取对象:

public static void GetResponse<TDataContract>(Uri uri, Action<TDataContract> callback)
            where TDataContract : IDataContract, class, new()
{
    var contract = new TDataContract();
    var contractType = contract.GetType();

    var wc = new System.Net.WebClient();
    wc.OpenReadCompleted += (o, a) =>
    {
        if (callback != null)
        {
            var ser = new DataContractJsonSerializer(typeof(TDataContract));
            var obj = ser.ReadObject(a.Result);
            callback((TDataContract)obj);
        }
    };

    wc.OpenReadAsync(uri);
}

【讨论】:

    【解决方案2】:

    尝试将class 添加到您的where 指令中:

    where TDataContract : IDataContract, class, new()
    

    【讨论】:

    • 它没有用。我有这个错误:无法从 'object' 转换为 'TDataContract' + 我在问题中写的相同错误 =(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多