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

时间:2016-09-30 12:41:16

标签: c#

好的简短背景。我尝试了各种方法来测试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简单地说它无法解析符号

1 个答案:

答案 0 :(得分:6)

只需使用接受类型参数而不是通用参数的JsonConvert.DeserializeType重载:

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

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