Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
CommandLineParser - Ein leichtgewichtiger Befehlszeilen-Parser
Repac3r
myCSharp.de - Member



Dabei seit:
Beiträge: 58

Themenstarter:

CommandLineParser - Ein leichtgewichtiger Befehlszeilen-Parser

beantworten | zitieren | melden

Beschreibung:

Mit diesem CommandLineParser ist es möglich übergeben Argumente zu parsen und in eine entsprechende Entity-Klasse exportieren zulassen, damit das Zugreifen der übergeben Argumente möglichst einfach gestaltet werden kann.

Das Format bzw. die Syntax der Argumente können selbstverständlich selbst definiert werden. Somit ist dieser Parser auch einfach abänderbar, ohne die Assembly neu zu kompilieren

Download

Die Assembly sowie ein entsprechendes Test-Projekt habe ich hier mal verknüpft.
Jeder kann damit machten was er will, dies ist einem komplett selbst überlassen.

Worauf ich mich jedoch freuen würde, wären Verbesserungsvorschläge, da ich noch nie eine Assembly entworfen habe, die für mehr bestimmt war, als bei mir zuhause genutzt zu werden.

Meine ProjektMappe ist als RAR im Anhang hinterlegt.

Nutzung

Die Nutzung ist im Prinzib ziemlich einfach gehalten.
Als Grundlage nehmen wir folgende Argumente:


--Address="Eine kleine Straße" --Name=MeinName  --Long=NotBad -i=42 -U -c=meineCompany

Hierbei gibt es folgende Features:
  • Ausgeschriebene Parameter (werden eingeleitet mit '--')
  • Kurzgeschriebene Parameter (werden eingeleitet mit '-')
  • Mehrere Typen sind erlaubt (string, int, bool, weitere folgend noch...)
  • Über Attribute lassen sich Felder benutzerdefiniert einstellen
  • Attribute werden automatisch in eine entsprechende Entity gemappt.
  • Abrufen von HilfeTexten, welche für jede Property gesetzt werden können.


- Entity

Hier möchte ich kurz erklären, wie eine solche Entity aussehen kann.


public class Option
    {
        [Command(Help="SomeHelp")]
        public string Adress { get; set; }

        [Command(Required=true)]
        public string Name { get; set; }

        [Command(Name="Long", Help="SomeMoreHelp")]
        public string AVeryVeryVeryLongProperty { get; set; }

        [Command(ShortName="i")]
        public int Id { get; set; }

        [Command]
        public bool UseSomeThing { get; set; }

        [Command(Name="Company", ShortName="c", Required=true)]
        public string Company { get; set; }
    }

Insgesammt gibt es 4 Möglichkeiten eine Property zu definieren:
  • Name: Hier kann man den Namen der Option definieren. Beispiel: --Name In diesem Fall wäre 'Name' der Name der jeweiligen Option. Ist dieser Wert nicht gesetzt, so wird automatisch der Name der Property benutzt.
  • ShortName: Hier kann man den Kürzel (Kurzschreibweiße) einer Option definieren. Beispiel: -N In diesem Fall wäre 'N' die Kurzschreibform. Ist auch dieser Wert nicht gesetzt, so wird das erste Zeichen des Property-Namen benutzt.
  • Help: Dies ist die Beschreibung zu der jeweiligen Option. Falls der User diese einfordern möchte.
  • Required: Setzt man dies, möchte man erzwingen, dass eine entsprechende Option gesetzt werden muss. Trifft dies nicht zu, führt dies zu einer Exception.


- Syntax defination

Selbstverständlich können die entsprechenden Separatoren frei definiert werden.
Hier ein kleines Beispiel wie man eine eigene Syntax definieren kann:


var parser = new CommandParser(true);
parser.RegisterSyntax(SyntaxType.ShortOptionInitiator, "-");
parser.RegisterSyntax(SyntaxType.OptionInitiator, "--");
parser.RegisterSyntax(SyntaxType.ValueSeparator, "=");

Standardmäßig werden die oben gennanten Beispiele schon im Konstruktor definiert.


- Help

Bei Fehleingaben oder sonstigen Problemen hat man die Möglichkeit, den Nutzern eine entsprechende Hilfe zu den Optionen anzeigen zulassen.


var result = Help.GetHelp<Option>();

Hier wird ein Dictionary zurück gegeben, als Key wird der PropertyName verwendet, als Value der entsprechende Hilfe-Text welchen man über die Attribute vergeben hat.

- Parsen

Hier mal ein komplettes Beispiel, wie man diesen Parser benutzt:


var parser = new CommandParser(true);

var resultList = parser.Parse(args);

var mapper = new CommandMapper();
var entity = mapper.Mapp<Option>(resultList);

Schlagwörter: <Bitte Schlagwörter, unter denen dein Snippet über die Suche gefunden werden soll, hier eintragen>
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Repac3r am .
Attachments
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15618
Herkunft: BW

beantworten | zitieren | melden

Das ist doch exakt das Handling, dass das NuGet-Paket 'CommandLineParser' auch inne hat, oder ist der Name nur ungluecklich gewaehlt, oder ist es ein Fork?
private Nachricht | Beiträge des Benutzers
Repac3r
myCSharp.de - Member



Dabei seit:
Beiträge: 58

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
Das ist doch exakt das Handling, dass das NuGet-Paket 'CommandLineParser' auch inne hat, oder ist der Name nur ungluecklich gewaehlt, oder ist es ein Fork?

Das ist mir bisher noch nicht aufgefallen, dann ist der Name einfach nur unglücklich gewählt worden.
private Nachricht | Beiträge des Benutzers