2016-04-18 53 views
1

我需要將變量對象類型作爲參數傳遞給構造函數,並且能夠從構造它的方法返回變量類型。它很難解釋,所以也許代碼會做得更好。將變量類型傳遞給構造函數,並返回傳入的相同類型

爲了將對象類型傳遞給構造函數,我試過了。

public async Task<BlockData.Block> Last() 
{ 
    return await new AsyncConnector<BlockData.Block>(Connection).Get(
     "/chain/last-block" 
     ); 
} 

,並接受它,我這樣做:

public class AsyncConnector<T> 
{ 
    NisConnection Connection = null; 

    public AsyncConnector(NisConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<T> Get(string uri) 
    { 
     var response = await Connection.Client.GetAsync(Connection.FullUri(uri)); 

     return JsonConvert.DeserializeObject<T>(
      JObject.Parse(await response.Content.ReadAsStringAsync()).ToString() 
     ); 
    } 
} 

我也試過這樣:

public async Task<BlockData.Block> Last() 
{ 
    return await new AsyncConnector(Connection).Get<BlockData.Block>(
     "/chain/last-block" 
     ); 
} 

public class AsyncConnector 
{ 
    NisConnection Connection = null; 

    public AsyncConnector(NisConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<T> Get<T>(string uri) 
    { 
     var response = await Connection.Client.GetAsync(Connection.FullUri(uri)); 

     return JsonConvert.DeserializeObject<T>(
      JObject.Parse(await response.Content.ReadAsStringAsync()).ToString() 
     ); 
    } 
} 

GetAsync方法需要的工作方式相同,但對於許多不同的對象類型。

我不斷收到的錯誤是:

型「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」的異常出現在mscorlib.dll,但在用戶代碼中沒有處理
其他信息:無法轉換類型「Newtonsoft.Json.Linq.JObject」到「NemApi.DTOs.BlockObjects.BlockData.Block」

+0

你可以直接反序列化字符串,而不用解析爲'JObject'嗎? – Hendry

+0

你是什麼意思? – netnoob

+0

它仍然存在不知道將其反序列化到哪種類型的問題,無論它是否從JObject或字符串反序列化。 – netnoob

回答

0

如果單純使用ReadAsAsync<T>System.Net.Http.Formatting,它會將您的JSON轉換成一個強類型對象的引擎蓋下。你不需要轉換或解析它。

public async Task<BlockData.Block> Last() 
{ 
    return await new AsyncConnector(Connection).Get<BlockData.Block>(
     "/chain/last-block"); 
} 

public class AsyncConnector 
{ 
    NisConnection Connection = null; 

    public AsyncConnector(NisConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<T> Get<T>(string uri) 
    { 
     var response = await Connection.Client.GetAsync(Connection.FullUri(uri)); 
     return await response.Content.ReadAsAsync<T>(); 
    } 
} 
+0

response.Content沒有方法ReadAsAsync只ReadAsStringAsync – netnoob

+1

你必須添加一個引用'System.Net.Http.Formatting'(HttpContentExtensions類) – Bidou

相關問題