Ich stieß vor kurzem auf die FubuCore Command Line Parsing-Implementierung Ich mag es wirklich, die Gründe sind:
- es ist einfach zu benutzen - obwohl ich keine Dokumentation dafür finden konnte, bietet die FubuCore-Lösung auch ein Projekt mit einer Reihe von Unit-Tests, die mehr über die Funktionalität aussagen, als jede Dokumentation es könnte
- es hat ein schönes objektorientiertes Design, keine Codewiederholungen oder andere Dinge, die ich früher in meinen Kommandozeilen-Parsing-Anwendungen hatte
- Es ist deklarativ: Sie schreiben im Grunde Klassen für die Befehle und Parametersätze und schmücken sie mit Attributen, um verschiedene Optionen festzulegen (z. B. Name, Beschreibung, obligatorisch/optional)
- die Bibliothek druckt sogar ein schönes Nutzungsdiagramm aus, das auf diesen Definitionen basiert
Im Folgenden finden Sie ein einfaches Beispiel für die Verwendung dieser Funktion. Um die Verwendung zu veranschaulichen, habe ich ein einfaches Dienstprogramm mit zwei Befehlen geschrieben: - add (fügt ein Objekt zu einer Liste hinzu - ein Objekt besteht aus einem Namen (string), einem Wert (int) und einem booleschen Flag) - list (listet alle aktuell hinzugefügten Objekte auf)
Als erstes habe ich eine Befehlsklasse für den Befehl "add" geschrieben:
[Usage("add", "Adds an object to the list")]
[CommandDescription("Add object", Name = "add")]
public class AddCommand : FubuCommand<CommandInput>
{
public override bool Execute(CommandInput input)
{
State.Objects.Add(input); // add the new object to an in-memory collection
return true;
}
}
Dieser Befehl benötigt eine CommandInput-Instanz als Parameter, also definiere ich diese als nächstes:
public class CommandInput
{
[RequiredUsage("add"), Description("The name of the object to add")]
public string ObjectName { get; set; }
[ValidUsage("add")]
[Description("The value of the object to add")]
public int ObjectValue { get; set; }
[Description("Multiply the value by -1")]
[ValidUsage("add")]
[FlagAlias("nv")]
public bool NegateValueFlag { get; set; }
}
Der nächste Befehl ist "list", der wie folgt implementiert wird:
[Usage("list", "List the objects we have so far")]
[CommandDescription("List objects", Name = "list")]
public class ListCommand : FubuCommand<NullInput>
{
public override bool Execute(NullInput input)
{
State.Objects.ForEach(Console.WriteLine);
return false;
}
}
Der Befehl "list" benötigt keine Parameter, daher habe ich eine NullInput-Klasse dafür definiert:
public class NullInput { }
Alles, was jetzt noch übrig ist, ist, dies in der Main()-Methode wie folgt zu verdrahten:
static void Main(string[] args)
{
var factory = new CommandFactory();
factory.RegisterCommands(typeof(Program).Assembly);
var executor = new CommandExecutor(factory);
executor.Execute(args);
}
Das Programm arbeitet wie erwartet und gibt Hinweise auf die korrekte Verwendung, falls ein Befehl ungültig ist:
------------------------
Available commands:
------------------------
add -> Add object
list -> List objects
------------------------
Und ein Anwendungsbeispiel für den Befehl "add":
Usages for 'add' (Add object)
add <objectname> [-nv]
-------------------------------------------------
Arguments
-------------------------------------------------
objectname -> The name of the object to add
objectvalue -> The value of the object to add
-------------------------------------------------
-------------------------------------
Flags
-------------------------------------
[-nv] -> Multiply the value by -1
-------------------------------------
0 Stimmen
Eine frühere Diskussion, split-string-enthalten-kommandozeilen-parameter-in-string-in-c# hat vielleicht einige Antworten.
1 Stimmen
Hallo, tut mir leid, es ist ein bisschen off-topic. aber ich benutze die "Anwendungseinstellungen", um Argumente an die Anwendung zu übergeben. Ich fand es ziemlich einfach zu bedienen und keine Notwendigkeit, Argument/Datei-Parsing zu schreiben, und keine Notwendigkeit für zusätzliche Bibliothek. msdn.microsoft.com/de-us/library/aa730869(VS.80).aspx
44 Stimmen
@call me Steve: Der Sinn von Kommandozeilenargumenten ist, dass sie bei jedem Aufruf variieren können - wie machen Sie das mit den Anwendungseinstellungen?