2015-09-28 111 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) –

相關問題