2016-06-16 14 views
3

Ich habe Probleme beim Zurückgeben von Null für diesen generischen Typ T. Ich habe versucht, es als Nullable, Nullable oder T? ohne Erfolg ...Returning null T

Diese Methode ist Teil einer abstrakten Klasse und ich muss es so allgemein wie möglich machen, damit ich jede Art von Objekt abrufen und von jeder abgeleiteten Klasse verwenden kann.

public T GetFromApi<T>(string apiRequest, string content) 
{ 
    try 
    { 
     log.Debug("Requesting '" + apiRequest + "' from API with the following parameters: " + content); 
     _httpClient.DefaultRequestHeaders.Accept.Clear(); 
     _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     _httpClient.DefaultRequestHeaders.Add("Authorization", string.Format("{0} {1}", _token.token_type, _token.access_token)); 

     var httpContent = new StringContent(content); 
     HttpResponseMessage response = _httpClient.GetAsync(apiRequest).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      //Returns requested Object (T) from API 
      log.Info("Returning requested object " + typeof(T).ToString());      
      return response.Content.ReadAsAsync<T>().Result; 
     } 
     else 
     { 
      log.Error("Error accessing API."); 
      return null; 
     } 
    } 
    catch (Exception ex) 
    { 
     log.Fatal("Error accessing API.", ex); 
     throw ex; 
    } 
} 

Die Rückkehr null auf die else-Anweisung gibt mir den Fehler:

Cannot convert null to type parameter 'T'

+0

Wie wäre es mit 'default (T)'? –

+2

BTW: Sie sollten 'throw;' über 'throw ex;' bevorzugen, um den Stack-Trace der ursprünglichen Exception beizubehalten. –

+1

tnks @UweKeim .. das löst ... – Nuno

Antwort

6

Null für T kann kein gangbarer Wert sein, wenn die in eine Struktur übergeben Typ ist.

Sie können stattdessen zurückgeben den Standardtyp für T, die für einen Referenztyp null ist:

else 
{ 
    log.Error("Error accessing API."); 
    return default(T); 
} 

Wie im folgenden Kommentar erwähnt, können Sie alternativ null zurück, wenn Sie T-class beschränken.

public T GetFromApi<T>(string apiRequest, string content) where T : class 
... 
else 
{ 
    log.Error("Error accessing API."); 
    return null; 
} 

jedoch in dem Fall, dass Sie möglicherweise vom Urtyp (bool, int, usw.) abrufen tun müssen, würden Sie nicht mehr in der Lage sein, diese Methode zu konsumieren.

+4

Eine weitere Option ist eine Beschränkung auf den generischen Typ für die Klasse. –

+0

genial ... so viel zu lernen noch :) Thnks! – Nuno

+0

@DerekVanCuyk großen Punkt! Aktualisiert. –