Ссылаться на статический член в статическом методе в классе Powershell

#powershell #class #properties #static #powershell-5.0

#powershell #класс #свойства #статический #powershell-5.0

Вопрос:

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

Сбой при использовании прямого доступа к статическому

 class OpPrj {

[string] $ProjectPath

static [string] $configFile = 'settings.json';

[OpPrj] static GetSettings(){
   return [OpPrj](Get-Content [OpPrj]::configFile | Out-String|ConvertFrom-Json);
}
  

Работает путем присвоения локальному

 class OpPrj {

  [string] $ProjectPath

  static [string] $configFile = 'settings.json';

  [OpPrj] static GetSettings(){
      $file = [OpPrj]::configFile
      Write-Host $file  # outputs settings.json
      return [OpPrj](Get-Content $file | Out-String | ConvertFrom-Json);
  }
  

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

1. Потому что ваш синтаксис неправильный: (Get-Content ([OpPrj]::configFile) | ... Именно так вам нужно ссылаться на статические свойства для любого типа (или перечисления!) при работе с привязкой параметров, то есть заключать в скобки. Я не понимаю, почему анализатор работает здесь таким образом, но это так.

2. Разве вы не должны использовать $this автоматическую переменную вместо [OpPrj]::configFile ?

3. @Theo $this не существует для статических членов, потому что они существуют для типа , а не для объекта .

4. @TheIncorrigible1 Ах, я этого не знал. Спасибо за предупреждение.

5. @TheIncorrigible1 Разместите это как ответ, и я пометю его как таковой. спасибо!

Ответ №1:

У вас синтаксическая ошибка при вызове Get-Content :

 Get-Content [OpPrj]::configFile
  

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

 Get-Content -Path ([OpPrj]::configFile)
  

Вам нужно будет следовать этому синтаксису для перечислений и статических членов класса.


Во всех (ваш вызов Out-String не требуется):

 class OpPrj
{
    [string] $ProjectPath

    static [string] $ConfigFile = 'settings.json'

    static [OpPrj] GetSettings()
    {
        return [OpPrj](Get-Content -Path ([OpPrj]::ConfigFile) -Raw | ConvertFrom-Json)
    }
}
  

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

1. Мистер Огайо … спасибо вам также за информацию о Out-String . 🙂