Атрибут параметра не устанавливает значение по умолчанию, как ожидалось - PullRequest
1 голос
/ 07 января 2020

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

Issue ...

  1. Единственная причина, по которой я переместил класс Options за пределы класса программы stati c, заключается в том, что я могу создать переменная в других частях приложения с именем Options и знать о классе Options. При этом я теперь получаю следующую ошибку. Я заметил, что атрибут Options 'Filepath' возвращает ноль, если технически это должна быть пустая строка. Почему мой Default = "" не работает должным образом?

'System.NullReferenceException:' Ссылка на объект не установлена ​​для экземпляра объекта. Snipper.Options.Filepath.get возвратил ноль

enter image description here

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using CommandLine;


    namespace Snipper
    {
        public class Options
        {   
            [Option('f', "filepath", Default = "", Required = false, HelpText = "Set output path, otherwise save in Pictures/Snipper")]
            public string Filepath { get; set; }

            [Option('w', "width", Default = 0, Required = false, HelpText = "Final output resolution width in pixels")]
            public int Width { get; set; }

            [Option('h', "height", Default = 0, Required = false, HelpText = "Final output resolution height in pixels")]
            public int Height { get; set; }
        }

        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                // do not allow multiple instances of the same program
                if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1)
                {
                    return;
                }

                // Commandline args
                var options = new Options();
                Parser.Default.ParseArguments<Options>(args).WithParsed<Options>(opts => options = opts);

                if (options.Filepath.Trim() == "")
                {
                    options.Filepath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "Snipper", "screenshot.png");
                }

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new MainForm(options));
            }
        }
    }

1 Ответ

0 голосов
/ 07 января 2020

Вы уверены, что это options, а не Filepath это null? (редактировать: я уверен, что это Filepath из предупреждения на экране, которое вы разместили)

Попробуйте заменить ошибочную строку на !(String.IsNullOrWhitespace(options?.Filepath))

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