Befehlszeile Parsing-API aus der Testapi-Bibliothek-Typ-Safe-Befehle wie zu
-
23-09-2019 - |
Frage
Bibliothek bei
Nutzungsauszug aus
http://blogs.msdn.com/ivo_manolov/archive/2008/12/17/9230331.aspx
Ein dritter gemeinsamer Ansatz besteht darin, starke Befehle aus den Befehlszeilenparametern zu bilden. Dies ist in Fällen üblich, in denen die Befehlszeile wie folgt aussieht:
some-exe COMMAND parameters-to-the-command
Das Parsen in diesem Fall ist ein bisschen mehr involviert:
- Erstellen Sie eine Klasse für jeden unterstützten Befehl, der aus der abstrakten Basisklasse des Befehls abgeleitet ist und eine erwartete Ausführungsmethode implementiert.
Übergeben Sie einen erwarteten Befehl zusammen mit den Befehlszeilenargumenten an commandLineParser.Parsecommand-Die Methode gibt eine stark typische Befehlsinstanz zurück, die ausgeführt werden kann ()-d.
// Beispiel #3: // Beispiel zum Parsen der folgenden Befehlszeile , was wir effektiv de-serialisieren und ausführen wollen.
public class RunCommand : Command { bool? Verbose { get; set; } int? RunId { get; set; } public override void Execute() { // Implement your "run" execution logic here. } } Command c = new RunCommand(); CommandLineParser.ParseArguments(c, args); c.Execute();
============================
Ich bekomme nicht, wenn wir bestimmte Klasse vor dem Parsen von Argumenten instanziieren, was ist der Punkt des Befehlszeilenarguments "Run", der die erste ist. Ich dachte, die Idee sei es, den Befehl/die Klasse/die Klasse auf der Grundlage eines Befehlszeilenparameters zu instanziieren und auszuführen ("Run" -Parameter wird zur Instanz -Runcommand -Klasse, "Walk" wird zu WalkCommand -Klasse und so weiter). Kann es mit der neuesten Version erfolgen? Darüber hinaus funktioniert das, was ich von Codeplex heruntergeladen habe, nicht so wie oben beschrieben und akzeptiert den allerersten Parameter ohne Schrägstrich nicht. Wenn ich also den Reflexion verwenden muss, muss ich den Befehlsnamen wie üblich übergeben und tun, dann multi -step - Bestimmung des Klassennamens, Instanziierung durch Reflexion und erst dann andere Argumente über Parseargumente analysieren.
Lösung
Micmit, das Beispiel in meinem Blog war tatsächlich fehlerhaft. Ich habe es seitdem korrigiert.
Im Wesentlichen ist Sie: 1. analysieren Sie das 1. Argument (den Befehlsnamen), um herauszufinden, welchen Befehl Sie instanziieren müssen. 2. Instanziieren Sie den Zielbefehl und übergeben Sie dann den Rest der Argumentliste an ihn. 3. Führen Sie den Befehl aus
dh in deinem Haupt, du würdest so etwas wie das folgende tun ...
if (String.Compare(args[0], "run", StringComparison.InvariantCultureIgnoreCase) == 0)
{
Command c = new RunCommand();
c.ParseArguments(args.Skip(1)); // or CommandLineParser.ParseArguments(c, args.Skip(1))
c.Execute();
}
Ich hoffe, das hilft.