2014-09-08 2 views
2

Я использовал этот код, но я получаю компилятор, предупреждающий, что этот метод создания устарел. Поскольку я хочу удалить предупреждение и перейти к более новой версии, я хочу исправить код, но я не могу заставить библиотеку CommandLineParser 1.9.7 работать.C# CommandLine.Parser - использовать конструктор, который принимает действие <ParserSettings>

CommandLine.Parser OptionParser = new CommandLine.Parser(new CommandLine.ParserSettings 
    { 
     CaseSensitive = UseCaseSensitive, 
     IgnoreUnknownArguments = IgnoreUnknownOptions, 
     MutuallyExclusive = EnableMutuallyExclusive 
    } 
); 
bool Result = OptionParser.ParseArguments(Args, this); 

Этот код работает, и результат будет True/False на основе параметров командной строки и переданных опций. Однако выдается следующее предупреждение.

Warning 1 'CommandLine.Parser.Parser(CommandLine.ParserSettings)' is obsolete: 'Use constructor that accepts Action<ParserSettings>.' 

В интерактивной справке показано это как пример использования функции.

new CommandLine.Parser(configuration:() => new CommandLine.ParserSettings(Console.Error)) 

Я попытался изменить код, но я не получаю право Lambda, и я не уверен, как получить эту работу. Пока код выполняется, я получаю только функции по умолчанию, я не могу изменить параметры Case Sensitive, Mutually Exclusive и т. Д.

Line с помощью конструктора (от встроенного IDE помощи)

bool Result = new CommandLine.Parser(configuration: (Settings) => new CommandLine.ParserSettings(UseCaseSensitive, EnableMutuallyExclusive, IgnoreUnknownOptions, null)).ParseArguments(Args, this); 

снова Пытаюсь с виртуальными параметрами:

bool Result = new CommandLine.Parser(configuration: (Settings) => new CommandLine.ParserSettings 
    { 
     CaseSensitive = UseCaseSensitive, 
     IgnoreUnknownArguments = IgnoreUnknownOptions, 
     MutuallyExclusive = EnableMutuallyExclusive 
    } 
).ParseArguments(Args, this); 

Интерактивная справка не поспевает с инструментом, и я мог используйте любые указатели, которые могут быть у кого-то. Заранее спасибо ...

ответ

10

Глядя на source code конструктор работает, что действие передается на новые параметры, которые он создает:

public Parser(Action<ParserSettings> configuration) 
{ 
    if (configuration == null) throw new ArgumentNullException("configuration"); 
    this.settings = new ParserSettings(); 
    configuration(this.settings); 
    this.settings.Consumed = true; 
} 

Так в Action<ParserSettings> вы должны установить нужные значения от параметра, не создать новые настройки (помните, что Action<T> прототип для функции, которая принимает T и не возвращает значение):

var parser = new CommandLine.Parser(s => 
{ 
    s.CaseSensitive = UseCaseSensitive; 
}); 

Примечание: исходный код Я связала сделать es, похоже, не совпадает с той версией, которую вы используете, поскольку Parser(ParserSettings) помечен internal в найденном вами источнике, что означает, что вы даже не сможете его вызвать, а некоторые свойства ParserSettings не отображаются в версии, которую я нашел , Тем не менее, я считаю, что этот ответ относится и к вашей версии.

+0

Спасибо, что небольшое изменение было тем, что мне нужно для исправления кода. Я узнаю эти Лямбды еще. –