2009-08-04 8 views
2

Ich habe eine switch-Anweisung in einer Klasse, die Command-Objekte generiert, basierend darauf, ob eine bestimmte Zeile in einer Codedatei mit dem bestimmten Code für dieses Command-Objekt übereinstimmt.Verwenden von Eigenschaften in Switch-Anweisungsfällen?

wie folgt aus:

switch (line): 
{ 
    case "#CODE1": 
     return new Command1(); 
    case "#CODE2": 
     return new Command2(); 
} 

Ich möchte wie diese es in etwas verwandeln:

switch (line): 
{ 
    case Command1.Code: 
     return new Command1(); 
    case Command2.Code: 
     return new Command2(); 
} 

ich es versucht, durch eine öffentliche statische Eigenschaft von Command1 zu schaffen, aber der Compiler beschwert sich ...

Gibt es eine Möglichkeit, etwas in dieser Richtung zu tun, über die sich der Compiler nicht beschweren wird?

Antwort

9

Ich denke, dass Sie dies nur mit Konstanten tun können ... wenn es also für Sie möglich ist, verwenden Sie konstante Felder anstelle von öffentlichen statischen Eigenschaften. Der Unterschied besteht darin, dass es bei der Kompilierung wie ein Literal behandelt wird. Wenn sich der Wert ändert, müssen Sie daher alle Assemblys neu kompilieren, die auf die Konstante verweisen.

2

Switch funktioniert nur bei numerischen Typen und String-Typen, nicht bei Eigenschaften. Sie können versuchen, eine öffentliche String-Konstante für Ihre Command1- und Command2-Klasse zu definieren, die Sie stattdessen aktivieren können.

public class Command1 
{ 
    public string const Code = "#CODE1"; 
} 
1

, da Sie mit Streichern arbeiten bin ich nicht sicher, ob es der beste Ansatz ist, aber Aufzählungen arbeitet mit mir

enum CommandEnum { CommandOne, ComandTwo, CommandN } 
//... 

CommandEnum myCommand; 
//... 
switch (myCommand) 
{ 
    case myCommand.CommandOne: 
     return new Command1(); 
    case myCommand.CommandTwo: 
     return new Command2(); 
    //... 
} 
0

Ich denke, Ihr Problem ist, müssen Sie Ihre Objekte, bevor Sie instanziiert kann ihre Eigenschaftswerte bestimmen.

Ich nehme an, Sie haben eine Codedatei mit Zeichen übersetzten Anweisungen, wie:

#CODE1 
#CODE2 

und Sie wollen eine Klasse jede Zeile der Datei zu lesen und führen Sie dann je nachdem, welche Befehle die Token definieren.

Sie haben es funktioniert, aber anstatt einen direkten String-Vergleich mit dem Token in der Datei zu machen, wollen Sie den Wert des Tokens in einer Eigenschaft Ihrer Objekte gespeichert? Das Problem bei diesem Ansatz besteht darin, dass Sie eine neue Instanz Ihres Objekts (Befehle 1 und 2) erstellen müssen, bevor Sie auf ihre Eigenschaftswerte verweisen können.

Wenn ich verstehe, was Sie getan haben und was Sie tun möchten, denke ich, Ihre Lösung war in Ordnung, wie es war. Ich bin mir nicht 100% ig sicher, dass ich wirklich verstehe, was Sie tun wollen und warum.

HTH

+0

Ich mag es nicht, dass die Stringkonstanten "auswendig gelernt" werden müssen. Ich möchte, dass sie an ihre jeweiligen Befehle angehängt werden. Tippfehler sind auf diese Weise nicht möglich. Intellisense wird sie fangen. –

+0

Wahr, aber Sie können immer noch Tippfehler in Ihrer Codedatei haben. Der Punkt ist, zu tun, was Sie wollen, Sie müssen die Variable zuerst instanziieren. Nachdem Sie den Eigenschaftswert überprüft haben, können Sie die neue Instanz nicht erstellen. Sie müssen die Instanz erstellen, bevor Sie nach Ihrem Wert suchen können. – Beth

+0

Nachdem ich Ihren Kommentar unten gelesen habe, bin ich mir nicht sicher, warum der Compiler sich über eine switch-Anweisung beklagen würde und nicht ob/then/else. Ich dachte, es beschwere sich über Ihre Objektreferenz, obwohl das nicht klar war. Wenn Sie es mit der if/then/else-Struktur arbeiten lassen, und Sie es zurück zu wechseln geändert haben, erhalten Sie immer noch Fehler vom Compiler? – Beth

0

Wenn Sie auf eine Klasse gegen Eigenschaften überprüfen möchten. Ich gehe davon aus, dass Sie diese Eigenschaften wahrscheinlich ändern und entsprechend überprüfen möchten. Sie müssen eine if, else if, else if type-Anweisung verwenden.

Wenn Sie eine jones verwenden, um eine switch-Anweisung zu verwenden, sind Sie SOL, es sei denn, Sie überprüfen einen integralen Typ auf konstante Werte. Wenn, sonst wenn, sonst wenn Blöcke hässlich sind, aber es wird tun, was du suchst.

0

Man konnte immer wieder auf die altbewährten fallen, wenn/sonst

if (line == Command1.Code) 
    return new Command1(); 
else if (line == Command2.Code) 
    return new Command2(); 

blockieren, die nicht so schlecht ist, ist es?

+0

Nein, nicht so böse ...... Ich musste das tun :) Ich ging mit einer statischen Readonly-Variable namens "Code" –

Verwandte Themen