2017-06-15 5 views
0

私は、クライアントのAPIに接続し、与えられたエンドポイントからクラスへの応答を収集するクラスライブラリを構築しています。言い換えれば、クライアントのDonutsエンドポイントにヒットし、JsonConvertを使用して、JSONオブジェクトの属性と一致するフィールドを持つDonutsクラスへのレスポンスを非直列化します。これはすべてうまくいいですが、エンドポイントがたくさんあり、同じコードを何度も何度も繰り返す方法がたくさんあります。 DRYnessと懸念の分離のために、私は、エンドポイントにかかわらず、残りの呼び出しを行うための別の名前空間を持ち、正しい結果をメインクラスに返します。ここでは(私はリクエストとレスポンスを設定するには、RestSharpを使用しています)それが今何をするかの例です:リスト<object>をリスト<CustomClass>に変換する方法はありますか?

public List<T> Index<T>(string Endpoint) 
    { 
     List<T> Results = new List<T>(); 
     RestClient Client = new RestClient(); 
     RestRequest Req = ConfigureGetRequest(Endpoint); 
     IRestResponse Resp = Client.Execute(Req); 

     if (Resp.StatusCode == System.Net.HttpStatusCode.OK) 
     { 
      Results = JsonConvert.DeserializeObject<List<T>>(Resp.Content, DeserializationSettings); 
     } 
     return Results; 
    } 
} 

あり、他のコードは、(場合-そうでなければエラー処理のため、実際のです)if文でだが、それですこの質問に実際には関係しません。私は複数のメソッドで同じコードを持っていますが、唯一の違いはList<Bagel>、またはList<Cruller>などです。私がしたいのは、このコードを独自のメソッドに抽出することですが、どうしたらよいかわかりません。今、私はList<object>に逆シリアル化しようとしていて、後でList<Donut>に変換しますが、それは私ができることではありません。私の他の考えは、パラメータ(public List<Donut> GetDonuts(string Endpoint))としてエンドポイント名を渡すことです、そして、どういうわけか、それが理にかなっていれば、どのタイプのオブジェクトを逆シリアル化するのかを判断するのですか? Anyhoo、誰かがこれを行うには良い方法についての洞察力を持っている場合、それは感謝されます!

EDIT

恐ろしい応答は、あなたの人々に感謝します。私は下のMatt Dillardの答えに従ってこのメソッドをリファクタリングしました。次のステップは、リストをリストに変換することです。上記のメソッドを呼び出す方法は、次のようになります。

public List<Donut> GetDonuts() 
{ 
    List<Donut> Results = new List<Donut>(); 
    MODULE MakeCall = new GET(); 
    return Results = MakeCall.Index("donuts")(); 
} 

私のインテリセンスは、メソッドの型引数のMODULE.Index(文字列)の使用状況から推測することができない」と言われます、明示的に型引数を指定してみてください。 "私はそのようにキャストしようとしました:(リスト)MakeCall.Index( "ドーナツ")(); しかしそれはうまくいかなかった。これをキャストして、GetDonuts、GetCrullersなどのメソッドを持つことができるようにする方法はありますか? Bascially TDonutへのすべての参照を置き換え

public List<T> GetStuff<T>(string endpoint) 
{ 
     List<T> Results = new List<T>(); 
     RestClient Client = new RestClient(); 
     RestRequest Req = ConfigureGetRequest(endpoint); 
     IRestResponse Resp = Client.Execute(Req); 

     if (Resp.StatusCode == System.Net.HttpStatusCode.OK) 
     { 
      Results = JsonConvert.DeserializeObject<List<T>>(Resp.Content, DeserializationSettings); 
     } 
     return Results; 
    } 
} 

+1

'List 'をお持ちの場合、これはコードの匂いです。おそらくジェネリックスが修正されているはずです次に、リストのようなことをすることができます。ドーナツ= GetStuff ();リスト cakes = GetStuff (); ' – mason

答えて

0

を私が起こるために必要なものを考え出しました。ジェネリックリストを逆シリアル化することはできませんが、ジェネリックリストを逆シリアル化してリストに入れることができます。最終的なコードは次のようになります。これは私がリーンとDRYする...などGetDonuts、GetCrullersを、使用することができます

public List<Donut> GetDonuts<T>() 
{ 
    GET MakeCall = new GET(); 
    List<Donut> Results = new List<Donut>(); 
    Results = MakeCall.Index<Donut>(); 
    return Results; 
} 

public List<T> Index<T>() 
{ 
    T Result; 
    List<T> ResultList = new List<T>(); 
    RestClient Client = new RestClient(); 
    RestRequest Req = ConfigureGetRequest(Endpoint); 
    IRestResponse Resp = Client.Execute(Req); 

    if (Resp.StatusCode == System.Net.HttpStatusCode.OK) 
    { 
     Result = JsonConvert.DeserializeObject<T>(Resp.Content, DeserializationSettings); 
     ResultList.Add(Result); 
    } 
    return ResultList; 
} 

。すべての助けをありがとう!

4

あなたはおそらくタイプTを受け入れ、などのような

public List<T> GetDonuts<T>() where T : class, new() 
    { 
6

ジェネリック医薬品のリストを返す一般的な方法としてそれを持っていると思います。

おそらくエンドポイントアドレスが変更されるため、これをパラメータとして追加できます。

コールこのような何か:

var donuts = GetStuff<Donut>("http://dunkin.com/api/allthedonuts"); 
+0

をメソッドに追加して、型を渡すこともできます。 var donuts = GetStuff (); – Cory

+0

@Cory:おっと。それを逃した。 –

関連する問題