将类型作为参数传递给方法

Waq*_*nju 0 c#

我有一个叫做的课RootObject:

public class RootObject
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Address { get; set; }
}

public void getdata()
{
    WebRequest request = WebRequest.Create("http://addresstojson.com/json.json");
    WebResponse response = await request.GetResponseAsync();

    using (var stream = new StreamReader(response.GetResponseStream()))
    {
       json = JsonConvert.DeserializeObject<RootObject>(stream.ReadToEnd());
    }
}
Run Code Online (Sandbox Code Playgroud)

在方法的最后一个语句中getdata(),传递类型:

JsonConvert.DeserializeObject</*here*/>(Stream.ReadToEnd())
Run Code Online (Sandbox Code Playgroud)

我想将类型作为参数传递给getdata(RootObject)方法.

有没有办法在C#中使用泛型来做到这一点?

Dmy*_*nko 12

实现强类型反序列化的标准方法是:

public T Get<T>()
{
    string json = ...; // get data somehow
    return JsonConvert.DeserializeObject<T>(json);
}
Run Code Online (Sandbox Code Playgroud)

看起来您想要异步读取结果,因此您需要实际返回结果Task<T>,以及使用xxxxAsync读取数据的方法版本:

public Task<T> GetData<T>()
{
    WebRequest request = WebRequest.Create("http://addresstojson.com/json.json");
    using (WebResponse response = await request.GetResponseAsync())
    {
        using(var stream = new StreamReader(response.GetResponseStream()))
        {
            string json = await stream.ReadToEndAsync();
            T result = JsonConvert.DeserializeObject<T>();
            return result;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处了解有关泛型的更多信息:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx