为什么不能将类型传递给泛型方法?

本文关键字:泛型方法 不能 类型 为什么 | 更新日期: 2023-09-27 18:09:44

简单介绍一下背景。我正在尝试各种方法来测试API,并且我正在尝试允许用户提供API调用的简单CSV文件,我的测试框架可以使用通用测试方法进行迭代。我在将类型传递给泛型API调用方法时遇到了麻烦。请允许我示范一下。

假设我有一个基本结构如下的方法

public T GetData<T>(Uri uri, HttpStatusCode expectedStatusCode)
{
        var myHttpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
        myHttpWebRequest.Accept = "application/json";
        var response = (HttpWebResponse)myHttpWebRequest.GetResponse();
        if (response.StatusCode != expectedStatusCode)
            Report.Log(ReportLevel.Failure, "ExpectedResponseCode:" + expectedStatusCode.ToString() + " ActualResponseCode:" + response.StatusCode.ToString());
        string responseString = "";
        using (var stream = response.GetResponseStream())
        {
            var reader = new StreamReader(stream, Encoding.UTF8);
            responseString = reader.ReadToEnd();
        }
        return JsonConvert.DeserializeObject<T>(responseString);
    }

我可以像这样调用上面的代码,没有问题

Person person = _apiHelper.GetData<Person>(uri, HttpStatusCode.Ok);

然而,假设我现在有一个类型,我已经获得了如下

Type returnType = Type.GetType(typeString, true, true);

为什么不能像下面这样调用GetData方法

var result = _apiHelper.GetData<returnType>(uri, HttpStatusCode.Ok);

Visual studio只是说它无法解析符号

为什么不能将类型传递给泛型方法?

使用JsonConvert。接受类型参数而不是泛型参数的DeserializeType重载:

public object GetData(Type t,Uri uri, HttpStatusCode expectedStatusCode)
{
    ....
    return JsonConvert.DeserializeObject(responseString,t);
}

这是XY问题的一个例子。你想要反序列化任意类型(问题X),并且认为你需要在运行时传递一个泛型类型(问题Y),所以当你遇到问题时,你询问Y。