2012-03-30 12 views
2

Ich habe zwei Funktionen geschrieben, die ähnlich aussehen, wie kann ich sie optimieren?Wie vermeidet man den folgenden wiederholten Code?

Hinweis:

1. AsyncCompletedEventArgs ist die Basisklasse von DownloadStringCompletedEventArg und UploadStringCompletedEventArgs.

2. Result Eigentum ist nicht in der AsyncCompletedEventArgs.

3. DownloadStringCompletedEventArgs eine Error Eigenschaft hat, wenn Errornull ist, dann versuchen Result Eigenschaft zuzugreifen, tritt die Ausnahme.

void fun1(DownloadStringCompletedEventArgs e) 
{ 
    try 
    { 
     string s = e.Result; 
    } 
    catch (WebException eX) 
    { 
     HandleWebException(); 
    } 
} 

void fun2(UploadStringCompletedEventArgs e) 
{ 
    try 
    { 
     string s = e.Result; 
    } 
    catch (WebException eX) 
    { 
     HandleWebException(); 
    } 
} 
+4

Warum haben Sie versuchen..Catch um eine einfache Zuordnung? –

+4

Ihr Code macht überhaupt keinen Sinn: (1) Sie sind um einen Wert zu einem nicht verwendeten lokalen Variablen zugewiesen wird (2) Sie versuchen catch-Block um eine Aussage, die werfen (mit Ausnahme der Implementierung von 'e.Result' nicht doesn ‚t die Konvention entspricht nicht von Immobilien Getter werfen ... –

+3

so sind wir sicher zu sagen, dass diese Handler sind transparent diejenigen, und Sie können die ganze Frage optimieren, indem keinen Code zu schreiben. –

Antwort

2

UploadStringCompletedEventArgs und DownloadCompletedEventArgs beide AsyncCompletedEventArgs verlängern aber leider ist die Basisklasse die Result Eigenschaft nicht definieren ist.

A Tryx Muster mit einem Ergebnis Accessor delegieren könnten hier sinnvoll sein:

public bool TryGetResult(Func<string> resultAccessor, out string result) 
{ 
    try 
    { 
     result = resultAccessor(); 
     return true; 
    } 
    catch(WebException) 
    { 
     HandleWebException(); 

     result = null; 
     return false; 
    } 
} 

void fun1(DownloadStringCompletedEventArgs e)  
{ 
    string result; 
    if (TryGetResult(() => e.Result, out result)) 
    { 
     // Success 
    } 
}  

void fun2(UploadStringCompletedEventArgs e)  
{  
    string result; 
    if (TryGetResult(() => e.Result, out result)) 
    { 
     // Success 
    } 
} 

ich empfehlen würde versuchen, einen Scheck zu AsyncCompletedEventArgs.Error zu arbeiten, obwohl, wie Ausnahmen recht teuer sind.

+0

Richard Szalay Lösung funktioniert gut. Akzeptiert! Vielen Dank! – Jeff7566

4

Sie Code kann wie unten etwas geändert werden:

void fun1(DownloadStringCompletedEventArgs e) { Process(e); } 

    void fun2(UploadStringCompletedEventArgs e) { Process(e); } 

    private void Process(dynamic eventArgs) 
    { 
     try 
     { 
      string s = eventArgs.Result; 
     } 
     catch (WebException e) 
     { 
      HandleWebException(e); 
     } 
    } 
+0

Es ist von Windows, keine Notwendigkeit zu sehen für Logik ... – m0skit0

+1

arbeiten Dies wird nicht ... wird die Ausnahme in 'Prozess (e.Result) geworfen werden,' nicht in 'Process' –

+0

Es ist der Zugang zu den' * StringCompletedEventArgs.Result', der die Ausnahme auslöst so der obige Code wird immer noch scheitern. –

0

Vielleicht könnten Sie eine Funktion schreiben, die einen Parameter vom Typ AsyncCompletedEventArgs nimmt (von denen beide eventArg Klassen, die Sie verwenden, erben) und dann versuchen, um es in Ihrem Code in den richtigen Typ zu konvertieren. Das würde es Ihnen ermöglichen, beide mit der gleichen Methode zu vervollständigen, aber wenn Sie Ihren Code betrachten, würde er wahrscheinlich nicht viel Nutzen für Sie haben. Viel Glück!

1

Etwas wie folgt aus:

void fun1(DownloadStringCompletedEventArgs e) 
{ 
    var result = Process<string>(e); 
    if (result != null) 
    { 
     // TODO your logic here 
    } 
} 

void fun2(UploadStringCompletedEventArgs e) 
{ 
    var result = Process<string>(e); 
    if (result != null) 
    { 
     // TODO your logic here 
    } 
} 

private T Process<T>(AsyncCompletedEventArgs result) 
{ 
    if (result.Error != null) 
     HandleWebException(result.Error); 
    else if (!result.Cancelled) 
    { 
     //var prop = result.GetType().GetProperty("Result"); 
     //return (T) prop.GetValue(result, null); 
     return (T) ((dynamic)result).Result; 
    } 
    //else // TODO handle cancelled 
    return default(T); 
} 
+0

'var prop = result.GetType(). GetProperty (" Ergebnis "); return (T) prop.GetValue (Ergebnis null); ' kann' return ((dynamisch) Ergebnis) .RESULT geändert werden; ' –

+0

Ja, schön ... :-) Ich denke, es sollte sein:' Rückkehr (T) ((dynamisches) Ergebnis).Ergebnis: ' –

Verwandte Themen