2013-08-08 11 views
10

Mam klasę, która obsługuje wszystkie transakcje API w aplikacji, nad którą pracuję. Ogólny zarys do jego metod wyglądać następująco:Kompensacja za brak parametrów "out" w metodach asynchronicznych.

public static async Task<bool> APICall(int bla) 
     { 
      HttpResponseMessage response; 
      bool res; 

      // Post/GetAsync to server depending on call + other logic 
      return res; 
     } 

Co chcę zrobić, to aby móc również zwrócić response.StatusCode do rozmówcy, ale ponieważ nie wolno używać „out” z parametrami asynchroniczne metody to trochę komplikuje.

Myślałem o zwrocie krotki zawierającej kod bool i kod odpowiedzi, czy jest lepszy sposób na zrobienie tego?

+0

Dlaczego nie zwrócić 'HttpResponseMessage'? – Artless

+0

@ Trickery Ponieważ istnieje pewna logika (parsowanie jason itp.), Którą chcę zawrzeć w metodzie. – Darajan

+0

Jeśli zwracasz kod statusu odpowiedzi HTTP, dlaczego potrzebujesz wartości logicznej? Do czego służy, gdy zwrócisz kod wskazujący, czy żądanie się powiodło, czy nie? – Artless

Odpowiedz

11

myślałem o powrocie krotki zawierający zarówno bool i kod odpowiedzi, czy istnieje lepszy sposób to zrobić?

Można utworzyć określoną klasę do przechowywania wyników. Osobiście nie lubię krotek, ponieważ nazwy takie jak Item1 lub Item2 nic nie mówią o wartościach.

class APICallResult 
{ 
    public bool Success { get; set; } 
    public HttpStatusCode StatusCode { get; set; } 
} 

    public static async Task<APICallResult> APICall(int bla) 
    { 
     HttpResponseMessage response; 
     bool res; 

     // Post/GetAsync to server depending on call + other logic 
     return new APICallResult { Success = res, StatusCode = response.StatusCode }; 
    } 
+2

+1. Krotki są okropne. Nie zapisują nic na temat zwracanych informacji. – jgauffin

+4

+1 Drobnoustroje nie są straszne, ale powinny być używane we właściwych miejscach. Zamiast klasy prywatnej na przykład w łańcuchu linq. Nie jako część publicznego interfejsu. –

+1

Na szczęście C# 7 wprowadził prawdziwe krotki na poziomie języka (z nazwami i wszystkim). TERAZ są wreszcie fantastyczne! – Marchy

8

Użyj wartości Tuple<x, y>, aby zwrócić więcej niż wartość. Na przykład, aby powrócić int i ciąg:

return Tuple.Create(5, "Hello"); 

i typ jest Tuple<int, string>

Albo można symulować out/ref z tablicą ... jeśli przejdą metoda tablicę jednego Element, to jak przepuszczanie ref lub out (w zależności od tego, kto powinien wypełnić element):

MyMethod(new int[1] { 6 }); 

void MyMethod(int[] fakeArray) 
{ 
    if (fakeArray == null || fakeArray.Length != 1) 
    { 
     throw new ArgumentException("fakeArray"); 
    } 

    // as a `ref` 
    fakeArray[0] = fakeArray[0] + 1; 

    // as an `out` 
    fakeArray[0] = 10; 
} 

lub przy użyciu skomplikowanych obiektów ...

class MyReturn 
{ 
    public string Text { get; set; } 
    public int Value { get; set; } 
} 

MyMethod(new MyReturn()); 

void MyMethod(MyReturn ret) 
{ 
    ret.Text = "Hello"; 
    ret.Value = 10; 
} 

Gotowe ...

Powiązane problemy