Вложенные конфигурационные массивы в C # CLI

#c# #.net-core #command-line-interface

#c# #.net-core #интерфейс командной строки

Вопрос:

Я занят игрой с методами настройки внутри приложения C # CLI, пытаясь переместить некоторые из моих жестко запрограммированных настроек в более долгосрочное управляемое местоположение (config.json).

Типы устройств[0].Проверка модели[0].Проверка возвращает null, DeviceTypes[0].Vendor и другие хороши, и даже кажется, что значение ModelCheck имеет правильную длину массива из конфигурации.

Похоже, что вложенный массив в конечном итоге не заполняется данными, и я не уверен, почему.

Config.cs

 public class Config
{
    private IConfigurationRoot config;

    private DeviceType[] _deviceTypes;
    public DeviceType[] DeviceTypes { get => _deviceTypes; }

    private Settings _settings;
    public Settings Settings { get => _settings; }

    public Config()
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("Config.json", optional: false, reloadOnChange: true);

        config = builder.Build();

        _deviceTypes = config.GetSection("Devices").Get<DeviceType[]>();
        _settings = config.GetSection("Settings").Get<Settings>();
    }
}

public class DeviceType
{
    public string Vendor { get; set; }
    public string Type { get; set; }
    public string ObjectOID { get; set; }
    public ModelCheck[] ModelChecks { get; set; }
}

public class ModelCheck
{
    public string Check;
    public string Regex;
    public string Example;
}

public class Settings
{
    public string[] SubnetPrefix { get; set; }
    public string SnmpCommunity { get; set; }
}  
  

Config.json

 {
  "Settings": {
    "SubnetPrefix": [
      "172.16.0.0/24",
      "172.16.1.0/24"
    ],
    "SnmpCommunity": "Public"
  },
  "Devices": [
    {
      "Vendor": "Extreme Networks",
      "Type": "Switch",
      "ObjectOID": "1.3.6.1.4.1.1916.2",
      "ModelChecks": [
        {
          "Check": "ExtremeXOS version 12.*",
          "Regex": "(?<Model>.*?> version (?<Version>.*?) by",
          "Example": "ExtremeXOS version 12.6.1.3 v1261b3 by release-manager on Thu Jul 21 09:46:07 PDT 2011"
        },
        {
          "Check": "ExtremeXOS.*",
          "Regex": ".*\((?<Model>.*?)\) version (?<Version>.*?) by",
          "Example": "ExtremeXOS (X450a-48t) version 15.3.1.4 v1531b4-patch1-3 by release-manager on Sun Mar 17 03:12:24 EDT 2013"
        }
      ]
    },
    {
      "Vendor": "Cisco",
      "Type": "Router",
      "ObjectOID": "1.3.6.1.4.1.9.1.1639",
      "ModelChecks": [
        {
          "Check": "Cisco IOS XR Software.*",
          "Regex": ".*\((?<Model>.*?>\),.*Version (?<Version>.*?)[",
          "Example": "Cisco IOS XR Software (Cisco ASR9K Series),  Version 6.2.25[Default]nCopyright (c) 2017 by Cisco Systems, Inc."
        }
      ]
    }
  ]
}
  

Комментарии:

1. можете ли вы поделиться json?

2. Теперь это доступно выше, извините, забыл, что это было бы своего рода полезно для оказания помощи 🙂

Ответ №1:

Похоже, что ModelCheck это единственный класс, в котором вы не указали getter и setter access ( { get; set; } ). Я предполагаю здесь, но может ли это быть проблемой?

Комментарии:

1. Хороший улов! Нужен был свежий взгляд, очевидно, конфигурационному связующему не нравятся поля, я заменил их на свойства, и это сработало. Теперь получаем все значения.

2. Да, очень просто определить, если вы не писали код самостоятельно ahah…it на устранение этих ошибок у меня обычно уходит больше всего времени