Jump to content
  • Advertisement
Sign in to follow this  
  • entries
    83
  • comments
    0
  • views
    66614

A reusable, reflection based command-line parser

Sign in to follow this  
shawnhar

900 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
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!