Sign in to follow this  
  • entries
    83
  • comments
    0
  • views
    65654

A reusable, reflection based command-line parser

Sign in to follow this  
shawnhar

844 views

I often find myself writing little throwaway utilities to help with other tasks, and many of these utilities need to parse command lines. There are myriad ways to do this in C#, ranging from the quick and dirty to the infinitely flexible and confusing. The middle ground approach shown here is not especially unique, but I have found it useful over the years, and thought I would post it here in case you do too.
Get it here.
Use it like so: public enum CatSpecies
{
Tabby,
Siamese,
Alley,
}


public class Options
{
public int NumberOfCats = 23;
public CatSpecies Species = CatSpecies.Siamese;
public bool ChaseTheCats;
public bool PostToYouTube;
}


class Program
{
static int Main(string[] args)
{
var options = new Options();
var parser = new CommandLineParser(options);

if (!parser.ParseCommandLine(args))
return 1;

DoStuff(options);

return 0;
}
}
You can run this program like so: MyProgram /NumberOfCats:10 /species:alley /posttoyoutube
It automatically generates usage help if you pass invalid values:[color="#008000"] > MyProgram /foo[/color]
[color="#000000"] Unknown option 'foo'

Usage: MyProgram

Options:
/NumberOfCats:value
/Species:value
/ChaseTheCats
/PostToYouTube[/color]
You can mark some options as required: public class Options
{
[CommandLineParser.Required]
public int NumberOfCats;

[CommandLineParser.Required]
public CatSpecies Species;

public bool ChaseTheCats;
public bool PostToYouTube;
}
Required options are specified without the /ParameterName: prefix: MyProgram 10 alley /posttoyoutube
Of course you will get an error if any required parameters are not specified.
The parser also supports list types, which allow a single parameter to be specified more than once (each entry will be appended to the list). For instance: public class Options
{
[CommandLineParser.Required]
public readonly List Names = new List();

[CommandLineParser.Name("Color")]
public readonly List Colors = new List();
}
This allows you to call: MyProgram shawn tracy rhys boo kess finch /color:red /color:white
Note that I was able to specify System.Drawing.Color values by string name (eg. "red"). This works because the parser uses TypeDescriptor/TypeConverter to convert string arguments into whatever types it finds in the Options object. If you have custom types, just write a matching TypeConverter and you'll be able to specify them directly as argument values.
Enjoy!aggbug.aspx?PostID=10296014

Source
Sign in to follow this  


0 Comments


Recommended Comments

There are no comments to display.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now