Существует ли .net magic для получения значений параметров по имени в консольном приложении? - PullRequest
5 голосов
/ 23 сентября 2010

Я разрабатывал консольные приложения .net с использованием C # и всегда просто диктовал, в какие параметры порядка следует вставлять, чтобы args [0] всегда было начальной датой, а args [1] всегда конечной датой, например.

однако я бы хотел перейти к использованию именованных параметров, чтобы любая комбинация параметров могла быть отправлена ​​в любом порядке, например, типичный "-sd" будет префиксом даты начала.

Я знаю, что мог бы разобрать args [] в поисках «-», а затем прочитать имя и посмотреть следующую позицию для сопровождающего значения, но перед этим хотел посмотреть, есть ли какие-либо запеченные в обработке для это довольно стандартная практика.

уже есть что-то подобное, что может сделать так:

DateTime startDate = (DateTime)((ConsoleParameters)args[])["sd"]

Я использую C # и .Net 4

Ответы [ 4 ]

5 голосов
/ 23 сентября 2010

Ничто не встроено в базовую среду.

Многие думают, что NDesk.Options полезно для такого рода вещей.Посмотрите на этот пример (взят прямо из предоставленной ссылки):

string data = null;
bool help   = false;
int verbose = 0;

var p = new OptionSet () {
    { "file=",      v => data = v },
    { "v|verbose",  v => { ++verbose } },
    { "h|?|help",   v => help = v != null },
};
List<string> extra = p.Parse (args);
3 голосов
/ 23 сентября 2010

Да, «магия» в том, что это обычная проблема, и она была адекватно решена. Поэтому я рекомендую использовать уже написанную библиотеку для обработки аргументов командной строки.

CommandLineParser отлично подходит для меня. Он достаточно документирован и достаточно гибок для каждого типа аргумента командной строки, который я хотел обработать. Кроме того, он помогает с документацией по использованию.

Я скажу, что я не самый большой поклонник создания определенного класса, который должен быть украшен атрибутами для использования этой библиотеки, но это незначительный момент, учитывая, что это решает мою проблему. И в действительности принудительное использование этого атрибутивного класса подталкивает меня к тому, чтобы отделить этот класс от того, откуда мое приложение фактически получает его настройки, и это всегда кажется лучшим дизайном.

0 голосов
/ 23 сентября 2010

Нет такой вещи как именованные параметры."-sd" это просто выбор для конкретного приложения.Это может быть также "/sd".Или "sd=".Или что угодно.

Поскольку именованных параметров нет, в .NET Framework нет ничего, что позволяло бы использовать синтаксис "-sd".

Но вы можете довольно легко создать свой собственный методчтобы получить набор «именованных параметров» для вашего приложения.

Редактировать: или, что еще лучше, вы можете использовать существующую библиотеку, как предложено в других ответах.

Редактировать: читая ответ @Sander Rijken, я вижу, что был не прав: до выпуска еще была реализация синтаксиса "-sd" в .NET 4.0.Но поскольку он был удален до окончательного выпуска, единственными способами по-прежнему остается создание собственного метода или использование существующей библиотеки.

0 голосов
/ 23 сентября 2010

Вы можете использовать NDesk.Options .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...