2015-09-28 181 views
0

我有一个类叫做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()); 
    } 
} 

getdata()方法的最后声明中,类型传递:

JsonConvert.DeserializeObject</*here*/>(Stream.ReadToEnd()) 

我想通过类型作为getdata(RootObject)方法的参数。

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

+2

'public void getdata (){... DeserializeObject (...)' –

+0

泛型类型是编译时常量,如果您需要泛型参数,您的方法必须声明它。 –

+0

'getdata'这样做是没有意义的,除非你也改变它返回'T'(因为'json'必须是'T'本身)。 – crashmstr

回答

12

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

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

它看起来像你想异步读取结果,所以你需要实际返回的结果为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; 
     } 
    } 
} 

您可以了解更多关于泛型这里:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx

+0

无法将类型T隐式转换为RootObject。 –

+0

你准备怎么做? –

+0

非常感谢。我找到了答案 –

0
public static async Task<T> GetData<T>(string add) 
    { 
     WebRequest request = WebRequest.Create(add); 
     WebResponse response = await request.GetResponseAsync(); 

     using (var stream = new StreamReader(response.GetResponseStream())) 
     { 
      return JsonConvert.DeserializeObject<T>(stream.ReadToEnd()); 
     } 
    } 
+0

请您澄清一下为什么这是不同的/比以前的答案更好?看起来与其他答案完全相同(添加了“异步”,这显然不是原始问题的一部分)。 –

+0

对不起,我忘了在问题中写'async'。当我申请@Dmytro Shevchenko给我的答案时。它向我展示了这个错误。**不能将Type T隐式转换为RootObject。**。答案稍作改动后。有效。我在这个链接中找到了答案。 [答案](http://stackoverflow.com/questions/27406715/pass-class-as-a-parameter-to-method) –

相关问题