2 Stimmen

Verwendung von Eigenschaften in Switch-Anweisungen?

Ich habe eine Switch-Anweisung in einer Klasse, die Befehlsobjekte erzeugt, je nachdem, ob eine bestimmte Zeile in einer Codedatei dem speziellen Code für dieses Befehlsobjekt entspricht.

wie diese:

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

Ich möchte es in etwas wie dieses verwandeln:

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

Ich habe es versucht, indem ich eine öffentliche statische Eigenschaft von Command1 erstellt habe, aber der Compiler beschwert sich...

Gibt es eine Möglichkeit, etwas in dieser Richtung zu tun, die der Compiler nicht beanstanden wird?

9voto

Botz3000 Punkte 38010

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

2voto

Scott Dorman Punkte 41206

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

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

1voto

nairdaen Punkte 1017

Da Sie mit Zeichenfolgen arbeiten, bin ich nicht sicher, ob es der beste Ansatz ist, aber mit Enums funktioniert für mich

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

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

1voto

Scott P Punkte 3677

Sie können jederzeit auf den bewährten if/ else-Block zurückgreifen

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

Das ist doch nicht so schlimm, oder?

0voto

Beth Punkte 9425

Ich denke, Ihr Problem ist, dass Sie Ihre Objekte instanziieren müssen, bevor Sie deren Eigenschaftswerte bestimmen können.

Ich gehe davon aus, dass Sie eine Codedatei mit tokenisierten Anweisungen haben, z. B.:

#CODE1
#CODE2

und Sie möchten, dass eine Klasse jede Zeile Ihrer Datei liest und dann die Anweisungen ausführt, die die Token definieren.

Sie haben es zum Laufen gebracht, aber anstatt einen direkten String-Vergleich mit dem Token in der Datei durchzuführen, wollen Sie den Wert des Tokens in einer Eigenschaft Ihrer Objekte speichern? Das Problem bei diesem Ansatz ist, dass Sie eine neue Instanz Ihres Objekts erstellen müssen (Befehle 1 und 2), bevor Sie auf deren Eigenschaftswerte verweisen können.

Wenn ich verstehe, was Sie getan haben und was Sie tun wollen, finde ich Ihre Lösung gut, so wie sie war. Ich bin mir aber nicht zu 100 % sicher, ob ich wirklich verstehe, was Sie tun wollen oder warum.

HTH

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X