myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » CommandLineParser - Ein leichtgewichtiger Befehlszeilen-Parser
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

CommandLineParser - Ein leichtgewichtiger Befehlszeilen-Parser

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Repac3r Repac3r ist männlich
myCSharp.de-Mitglied

Dabei seit: 01.03.2014
Beiträge: 57
Entwicklungsumgebung: VS 12 Pro


Repac3r ist offline

CommandLineParser - Ein leichtgewichtiger Befehlszeilen-Parser

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
--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.

C#-Code:
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:

C#-Code:
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.

C#-Code:
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:

C#-Code:
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>


Dateianhang:
unknown CommandLineParser-Console.rar (101,13 KB, 191 mal heruntergeladen)

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Repac3r am 14.12.2014 21:03.

Neuer Beitrag 14.12.2014 20:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.010
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
Neuer Beitrag 14.12.2014 21:03 Beiträge des Benutzers | zu Buddylist hinzufügen
Repac3r Repac3r ist männlich
myCSharp.de-Mitglied

Dabei seit: 01.03.2014
Beiträge: 57
Entwicklungsumgebung: VS 12 Pro

Themenstarter Thema begonnen von Repac3r

Repac3r ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
Neuer Beitrag 14.12.2014 21:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 5 Jahre.
Der letzte Beitrag ist älter als 5 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 07.08.2020 13:47