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

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

Сбой при использовании Direct To Static

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);
  }

person ΩmegaMan    schedule 13.03.2019    source источник
comment
Поскольку ваш синтаксис неверен: (Get-Content ([OpPrj]::configFile) | ... Это способ, которым вам нужно ссылаться на статические свойства для любого типа (или перечисления!) при работе с привязкой параметров, то есть заключенными в круглые скобки. Я не понимаю, почему здесь так работает парсер, но это так.   -  person Maximilian Burszley    schedule 13.03.2019
comment
Разве вы не должны использовать автоматическую переменную $this вместо [OpPrj]::configFile ?   -  person Theo    schedule 13.03.2019
comment
@Theo $this не существует для статических членов, потому что они существуют в типе, а не в объекте.   -  person Maximilian Burszley    schedule 13.03.2019
comment
@ TheIncorrigible1 А, я этого не знал. Спасибо за предупреждение.   -  person Theo    schedule 13.03.2019
comment
@ TheIncorrigible1 Поместите это как ответ, и я отмечу его как таковой. спасибо!   -  person ΩmegaMan    schedule 13.03.2019


Ответы (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)
    }
}
person Maximilian Burszley    schedule 13.03.2019
comment
Мистер Огайо... спасибо и за информацию о Out-String. :-) - person ΩmegaMan; 13.03.2019