ConsoleApp.CommandLine 1.1.2

Tools for building simple console application.

There is a newer version of this package available.
See the version list below for details.
Install-Package ConsoleApp.CommandLine -Version 1.1.2
dotnet add package ConsoleApp.CommandLine --version 1.1.2
<PackageReference Include="ConsoleApp.CommandLine" Version="1.1.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ConsoleApp.CommandLine --version 1.1.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: ConsoleApp.CommandLine, 1.1.2"
For F# scripts that support #r syntax, copy this into the source code to reference the package.

Quick Start

Basics

To start, you need to configure the entry point to the application. Where "ConsoleApp" will be your class with a command handler.

using System

class Program
{
	public static int Main()
	{
		return CommandLine.Run<Program>(CommandLine.Arguments, defaultCommandName: "SayHello")
	}	
	public static int SayHello()
	{
		Console.WriteLine("Hello!");
		return 0;
	}
}

CommandLine.Run relies on reflection to find methods. So they should be static and return int which is Exit Code

Now you can test your application:

myapp.exe SayHello 
#>Hello!
myapp.exe SAYHELLO
#>Hello! -- command name is case-insensitive (parameters are not!)
myapp.exe 
#>Hello! - Too because 'defaultCommandName' is set to 'SayHello'

Parameter bindings

Positional and named parameters

You can add parameters to your command which is automatically binds by name or position

public static int SayHello(string name)
{
	Console.WriteLine("Hello " + name + "!");
	return 0;
}

Testing:

myapp.exe SayHello Mike 
#>Hello Mike!
myapp.exe SayHello --name Jake
#>Hello Jake!

List parameters

You can add array parameter to collect multiple values as shown below:

public static int SayHello(string[] names)
{
	Console.WriteLine("Hello " + string.Join(", ", names) + "!");
	return 0;
}

Testing:

myapp.exe SayHello --names Mike Jake
#>Hello Mike, Jake!

Parameter accepting multiple values can be only named.

Optional parameters

You can make any parameter optional by specifying default value.

public static int ShowOptionalParameter(int myOptionalParam = 100)
{
	Console.WriteLine("My optional parameter is " + myOptionalParam);
	return 0;
}

Testing:

myapp.exe ShowOptionalParameter --myOptionalParam 200
#>My optional parameter is 200
myapp.exe ShowOptionalParameter 300
#>My optional parameter is 300
myapp.exe ShowOptionalParameter
#>My optional parameter is 100

Flag parameters

You can have a flag(true/false) parameter. It's presence is considered to be "True" and absence is "False".

public static int ShowFlag(bool myFlag)
{
	Console.WriteLine(myFlag ? "Flag is set" : "Flag is not set");
	return 0;
}

Testing:

myapp.exe ShowFlag --myFlag
#>Flag is set
myapp.exe ShowFlag
#>Flag is not set

Parameters values starting with hyphen(-) symbol

Negative numbers (such as -1000) are interpreted as values by default. But strings like "-a", "-hello" are interpreted as named parameters.
To stop this behavior you could start parameters with bare hyphen parameter.

myapp.exe - --message -hello --class -a

Enforcing positional parameters

You could pass bare double hyphen(--) and anything after it will be threated as positional parameters.

myapp.exe --type message -- value1 value2 value3

No special symbols are interpeted after double hyphen(--) even another double hypthen.

myapp.exe --type message -- -value1 --value2 --value3-- --

Supported Parameter Types

  • Primitive types (int, byte, char ...)
  • BCL types (String, DateTime, Decimal)
  • Nullable types
  • Enum types
  • Types with TypeConverterAttribute (Point, Guid, Version, TimeSpan ...)
  • Types with Parse(string value) method (IpAddress, Guid ...)
  • Types with explicit/implicit conversion from string

Quick Start

Basics

To start, you need to configure the entry point to the application. Where "ConsoleApp" will be your class with a command handler.

using System

class Program
{
	public static int Main()
	{
		return CommandLine.Run<Program>(CommandLine.Arguments, defaultCommandName: "SayHello")
	}	
	public static int SayHello()
	{
		Console.WriteLine("Hello!");
		return 0;
	}
}

CommandLine.Run relies on reflection to find methods. So they should be static and return int which is Exit Code

Now you can test your application:

myapp.exe SayHello 
#>Hello!
myapp.exe SAYHELLO
#>Hello! -- command name is case-insensitive (parameters are not!)
myapp.exe 
#>Hello! - Too because 'defaultCommandName' is set to 'SayHello'

Parameter bindings

Positional and named parameters

You can add parameters to your command which is automatically binds by name or position

public static int SayHello(string name)
{
	Console.WriteLine("Hello " + name + "!");
	return 0;
}

Testing:

myapp.exe SayHello Mike 
#>Hello Mike!
myapp.exe SayHello --name Jake
#>Hello Jake!

List parameters

You can add array parameter to collect multiple values as shown below:

public static int SayHello(string[] names)
{
	Console.WriteLine("Hello " + string.Join(", ", names) + "!");
	return 0;
}

Testing:

myapp.exe SayHello --names Mike Jake
#>Hello Mike, Jake!

Parameter accepting multiple values can be only named.

Optional parameters

You can make any parameter optional by specifying default value.

public static int ShowOptionalParameter(int myOptionalParam = 100)
{
	Console.WriteLine("My optional parameter is " + myOptionalParam);
	return 0;
}

Testing:

myapp.exe ShowOptionalParameter --myOptionalParam 200
#>My optional parameter is 200
myapp.exe ShowOptionalParameter 300
#>My optional parameter is 300
myapp.exe ShowOptionalParameter
#>My optional parameter is 100

Flag parameters

You can have a flag(true/false) parameter. It's presence is considered to be "True" and absence is "False".

public static int ShowFlag(bool myFlag)
{
	Console.WriteLine(myFlag ? "Flag is set" : "Flag is not set");
	return 0;
}

Testing:

myapp.exe ShowFlag --myFlag
#>Flag is set
myapp.exe ShowFlag
#>Flag is not set

Parameters values starting with hyphen(-) symbol

Negative numbers (such as -1000) are interpreted as values by default. But strings like "-a", "-hello" are interpreted as named parameters.
To stop this behavior you could start parameters with bare hyphen parameter.

myapp.exe - --message -hello --class -a

Enforcing positional parameters

You could pass bare double hyphen(--) and anything after it will be threated as positional parameters.

myapp.exe --type message -- value1 value2 value3

No special symbols are interpeted after double hyphen(--) even another double hypthen.

myapp.exe --type message -- -value1 --value2 --value3-- --

Supported Parameter Types

  • Primitive types (int, byte, char ...)
  • BCL types (String, DateTime, Decimal)
  • Nullable types
  • Enum types
  • Types with TypeConverterAttribute (Point, Guid, Version, TimeSpan ...)
  • Types with Parse(string value) method (IpAddress, Guid ...)
  • Types with explicit/implicit conversion from string

Release Notes

# 1.1.2
-added bare double hyphen to enforce positional parameters
-added bare single hyphen to disable hyphen interpretation in values
-added special treatment for negative numbers
- added CommandLine.DescribeOnBindFailure which controls reaction on method binding failure (true to run CommandLine.Describe(), false to throw exception).
- added enum flags binding subroutine, now "--flag Flag1 Flag2 Flag3" arguments are supported.
- changed method binding order to from most parameters to less (original was chaotic), binding strategy is still - "first match".
- added non-generic Run and Describe methods
- fixed bug with positional parameters binding
# 1.0.0
- initial release

NuGet packages (1)

Showing the top 1 NuGet packages that depend on ConsoleApp.CommandLine:

Package Downloads
CodeContractsRemover
Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version History

Version Downloads Last updated
1.3.5 238 11/11/2020
1.3.4 172 9/29/2020
1.3.2 2,973 7/5/2018
1.3.1 503 6/20/2018
1.2.9 523 5/31/2018
1.2.7 485 5/29/2018
1.2.6 495 5/21/2018
1.2.5 659 5/17/2018
1.2.2 2,282 3/9/2018
1.1.2 608 10/18/2017
Show less