好的简短背景.我正在尝试各种方法来测试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);
}
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地将上述内容如下调用
Person person = _apiHelper.GetData<Person>(uri, HttpStatusCode.Ok);
Run Code Online (Sandbox Code Playgroud)
但是假设我现在有一个我已经获得的类型,如下所示
Type returnType = Type.GetType(typeString, true, true);
Run Code Online (Sandbox Code Playgroud)
为什么我不能按如下方式调用GetData方法
var result = _apiHelper.GetData<returnType>(uri, HttpStatusCode.Ok);
Run Code Online (Sandbox Code Playgroud)
Visual Studio简单地说它无法解决这个问题
只需使用接受类型参数而不是通用参数的JsonConvert.DeserializeType重载:
public object GetData(Type t,Uri uri, HttpStatusCode expectedStatusCode)
{
....
return JsonConvert.DeserializeObject(responseString,t);
}
Run Code Online (Sandbox Code Playgroud)
这是XY问题的一个例子.你想反序列化任意类型(问题X),并认为你需要在运行时传递泛型类型(问题Y),所以当你遇到困难时,你会问Y.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |