Как инициализировать статическое свойство словаря в классе Powershell? - PullRequest
0 голосов
/ 13 сентября 2018

Есть ли способ, чтобы статическое свойство в классе Powershell содержало универсальный словарь?Без синтаксиса инициализации, существующего в C #, я не нашел способа сделать это.

enum Environment
{
    Production
    QA
    Dev
}

class Config
{
    # How to get this populated?
    static [System.Collections.Generic.Dictionary[Environment, hashtable]] $EnvData
}

Потенциальные обходные пути:

  1. Add-Type и класс C #
  2. Метод GetEnvData ()

Есть ли лучший способ, о котором я не думал?

1 Ответ

0 голосов
/ 13 сентября 2018

Как и в C #, вы можете использовать статический конструктор (для которого инициализаторы являются синтаксическим сахаром, во всяком случае):

class Config
{
    static [System.Collections.Generic.Dictionary[Environment, hashtable]] $EnvData

    static Config() {
        $d = New-Object ([System.Collections.Generic.Dictionary[Environment, hashtable]])
        $d["Production"] = @{Setting="Foo"}

        [Config]::EnvData = $d
    }
}

Использование local не обязательно, но я сплю лучше, зная, что инициализация атомарная.

Вы можете также использовать инициализатор ($EnvData = ...), но это немного сложно в этом случае, так как создание универсального Dictionary в одном операторе, ну, неудобно, а синтаксис класса не не нравится, если вы усложняетесь (каналы, вызовы вложенных функций). Вы могли бы, если захотите, разделить инициализацию на отдельную скрытую статическую функцию и вызвать ее для инициализации (... $EnvData = [Config]::initialEnvData()), которая может быть более читабельной, чем один большой конструктор, если у вас много концептуально независимых свойств.

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