2009-08-17 11 views
1

Ich habe eine switch-Anweisung, die einige Logik immer wieder ausführt. Anstatt dann cut and paste zu verwenden, wollte ich es in eine Funktion bringen, aber dabei versage ich schlecht.Break-Tag innerhalb einer Methode

Dies ist, was ich tun möchte, aber es kompiliert nicht, da das Break-Tag in der Funktion nicht existiert. Kann jemand dies zu einer besseren Arbeitsversion umgestalten?

switch(param.ToString()) 
{ 
    case "1": 
    BreakIfNotArgumentType<B>(param); 
//do stuff 
    break; 
    case "2": 
    BreakIfNotArgumentType<BF>(param); 
//do stuff 
    break; 
} 

    private T BreakIfNotArgumentType<T>(object argumentObject) 
    { 
     if (argumentObject is T) 
     { 
      return (T)argumentObject; 
     } 
     else 
     { 
      break; 
     }    
    } 

Antwort

2

Ihre Funktion repliziert im Wesentlichen die Funktionalität des Operators as.

string foo = "foo"; 

.... 

object a = foo; 
object b = 12; 
.... 

string bar = a as string; // will give you "foo" 
string zed = b as string; // returns null 

Der Operator as fungiert als eine Runtime-sichere Besetzung. Wenn die Zielinstanz nicht in den Zieltyp umgewandelt werden kann, wird eine Nullreferenz zugewiesen. Aus diesem Grund wird es nur mit Referenztypen funktionieren. Die häufigste Verwendung ist so ...

string bar = a as string; 

if(bar != null) 
{ 
    // do stuff 
} 

Da dies die Typprüfung und Gießvorgang in einer Erklärung gibt.

Sie sollten Ihre switch-Anweisung posten, und wir können sie möglicherweise besser rationalisieren. Der Versuch, eine wirklich Inline-Funktion zu schreiben, wie Sie es getan haben (wo Sie erwartet hatten, dass sie den Code in der Funktion in Ihre switch-Anweisung einfügt, wodurch sie eher zu einem Makro als zu einer Funktion wird), wird nicht funktionieren.

0

Sie könnten die Funktion eine Null zurückgeben, wenn das Argument nicht gegossen werden kann oder eine Ausnahme für ein paar Ideen werfen, wie man diesen Teil des Codes zu behandeln.

private T BreakIfNotArgumentType<T>(object argumentObject) 
    { 
     if (argumentObject is T) 
     { 
      return (T)argumentObject; 
     } 
     else 
     { 
      return null; 
     }    
    } 

Oder

private T BreakIfNotArgumentType<T>(object argumentObject) 
    { 
     if (argumentObject is T) 
     { 
      return (T)argumentObject; 
     } 
     else 
     { 
      throw CustomException("Argument wasn't valid!"); 
     }    
    } 
+0

Die Ausnahme Lösung ist interessant, aber es gibt Leistungsbedenken, und es ist wirklich kein Ausnahmefall; Es wird erwartet, dass es mindestens einmal pro Switch-Anweisung passiert. Daher würde ich die Nulllösung bevorzugen. –

+0

Das ist in Ordnung, ich denke nur, dass die Ausnahme-Lösung berücksichtigt werden sollte, als ob die Anforderung, dass etwas von einem bestimmten Typ sein sollte, dies irgendwie durchgesetzt werden sollte. Die Null-Lösung ist eleganter, obwohl der Code, der diese Funktion aufruft, den Wert Null zurückgibt. –

+0

@JB: Die Ausnahmelösung hinterlässt auch den Code, der die Funktion aufruft, um zu wissen, dass eine Ausnahme ausgelöst werden kann, was wohl schwerer zu wissen (oder jedenfalls abzuleiten) ist als die Möglichkeit einer Null. –

0

Machen Sie Ihre Methode einen boolean zurückzukehren und den Rückgabewert überprüfen:

switch(param.ToString()) 
{ 
    case "1": 
    if (CheckForArgumentType<B>(param)) 
    { 
    // Do your cast here 
    param = (B)param 
    } 
    else 
    break; 
    case "2": 
    if (CheckForArgumentType<B>(param)) 
    { 
    // Do your cast here 
    param = (B)param 
    } 
    else 
    break; 
    } 
    ................. 

    private bool CheckForArgumentType<T>(object argumentObject) 
    { 
     return (argumentObject is T) 

    } 
+1

Ist diese Funktion wirklich lesbarer als nur "if (param is B)" zu sagen? –

+0

Absolut stimme mit Ihnen überein. Ich habe gerade dies, um "erweiterbar" Version für den Fall, dass Sie mehr Validierung, die nur Typ prüfen benötigen –

0

, wenn Sie nur 2 Werte mit vergleichen - if-Anweisung statt

Verwandte Themen