2016-09-12 10 views
1

汎用メソッドSendHttpRequest<TRequest, TResponse>は、汎用タイプの入力として要求タイプと応答タイプを取ります。 response-typeは、ブール値または応答を表すクラスのいずれかです。boolean戻り型の汎用メソッドからbooleanを返します

私の仕事は、を返します。この方法ではHTTPリクエストが成功し、TResponseboolです。代わりにTResponseのタイプが異なる場合は、応答内容をTResponseオブジェクトにシリアル化して解除する必要があります。 trueを返すと、コンパイル時エラーが発生します。 boolean型とnon-boolean型の両方をサポートする単一のメソッドを持つ方法はありますか?

私はあなたがすでにそれは悪いデザインだということを理解し、しかし、あなたは本当に、まさにこのようにそれを作りたい場合は、あなたがそれを行うことができたと
private async Task<TResponse> SendHttpRequest<TRequest, TResponse>(TRequest request) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = "http://example.com/"; 

     var response = await client.PostAsJsonAsync("api_path", request).ConfigureAwait(false); 

     if (!response.IsSuccessStatusCode) 
     { 
      throw new MyException(response); 
     } 

     if (typeof (TResponse) == typeof (bool)) 
     { 
      return true; // Generates compile-time error 
     } 
     else 
     { 
      var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
      return JsonConvert.DeserializeObject<TResponse>(content); 
     } 
    } 
} 
+1

*「ブールおよび非ブールの両方をサポートしています戻り値の型 "* ='オブジェクト '。 – Sinatr

答えて

2

private async Task<TResponse> SendHttpRequest<TRequest, TResponse>(TRequest request) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = "http://example.com/"; 

     var response = await client.PostAsJsonAsync("api_path", request).ConfigureAwait(false); 

     if (!response.IsSuccessStatusCode) 
     { 
      throw new MyException(response); 
     } 

     if (typeof (TResponse) == typeof (bool)) 
     { 
      return (TResponse)(object)true; 
     } 
     else 
     { 
      var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
      return JsonConvert.DeserializeObject<TResponse>(content); 
     } 
    } 
} 
関連する問題