2016-04-18 8 views
1

変数オブジェクト型をコンストラクタの引数として渡す必要があり、構築するメソッドから変数型を返す必要があります。説明するのは難しいので、おそらくコードはより良い仕事をするでしょう。変数型をコンストラクタに渡し、渡された型と同じ型を返します

オブジェクト型をコンストラクタに渡すために、私はこれを試しました。私もこれを試してみました

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<BlockData.Block>(Connection).Get(
     "/chain/last-block" 
     ); 
} 

、それを受け取るために、私はこれを行う

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で発生したが、ユーザーコードで
追加情報を扱っていなかった

:タイプを変換できません。 「NemApi.DTOs.BlockObjects.BlockData.Block」から「Newtonsoft.Json.Linq.JObject」

+0

「JObject」として解析することなく文字列を直接デシリアライズできますか? – Hendry

+0

どういう意味ですか? – netnoob

+0

JObjectや文字列から逆シリアル化されているかどうかに関係なく、逆シリアル化する型を知らないという問題があります。 – netnoob

答えて

0

あなたは、単にSystem.Net.Http.FormattingからReadAsAsync<T>を使用している場合は、それはボンネットの下に強く型付けされたオブジェクトへのあなたの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

関連する問題