TypeConverter (регистрация) создает исключение NullRefException в PowerShell - PullRequest
2 голосов
/ 10 января 2020

У меня есть класс PowerShell, который я хочу автоматически конвертировать из string.

Так что я определил TypeConverter следующим образом:

    class StringToAcmeStateConverter : System.Management.Automation.PSTypeConverter {
    [bool] CanConvertFrom([object] $object, [Type] $destinationType) {
        if($object -is [string]) {
            return Test-Path ([string]$object);
        }

        return $false;
    }

    [bool] CanConvertTo([object] $object, [Type] $destinationType) {
        return $false
    }

    [object] ConvertFrom([object] $sourceValue, [Type] $destinationType,
        [IFormatProvider] $formatProvider, [bool] $ignoreCase)
    {
        if($null -eq $sourceValue) { return $null; }

        if(-not $this.CanConvertFrom($sourceValue, $destinationType)) {
            throw [System.InvalidCastException]::new();
        }

        $paths = [AcmeStatePaths]::new($sourceValue);
        return [AcmeDiskPersistedState]::new($paths, $false, $true);
    }

    [object] ConvertTo([object] $sourceValue, [Type] $destinationType,
        [IFormatProvider] $formatProvider, [bool] $ignoreCase)
    {
        throw [System.NotImplementedException]::new();
    }
}

[System.ComponentModel.TypeConverter([StringToAcmeStateConverter])]
<# abstract #> class AcmeState {
    AcmeState() {
        if ($this.GetType() -eq [AcmeState]) {
            throw [System.InvalidOperationException]::new("This is intended to be abstract - inherit To it.");
        }
    }

    <# omitted #>
}

(полный список кодов здесь: https://raw.githubusercontent.com/PKISharp/ACMESharpCore-PowerShell/deep-state/ACME-PS/internal/classes/AcmeState.ps1)

Но PowerShell теперь генерирует исключение NullRefException изнутри конвейера. Как заставить PS использовать конвертер правильно.

Обновление

Так как этот вопрос не содержал достаточно информации для полного воспроизведения, я создал суть, содержащую текущее ( ошибочный код модуля: gist.github.com/glatzert/ba32f291b9155e6d19c29fbe9594a7c5

1 Ответ

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

TypeConversion с классами PowerShell имеет некоторые неочевидные проблемы.

Мой первый подход с атрибутом TypeConverter-Attribute не выполняется ни с NullRefException, ни с UnknownTypeException (это зависит от порядка классов в вашем * .ps1) .

Я копался в Types.ps1 xml и создал следующее xml:

<Types>
  <Type>
    <Name>AcmeState</Name>
      <TypeConverter>
        <TypeName>StringToAcmeStateConverter</TypeName>
      </TypeConverter>
  </Type>
</Types>

и добавил TypesToProcess к .psd1, указывающему на вышеупомянутый ps1 xml.
Это не удастся, заявив, что конвертер неизвестен, что, вероятно, означает, что PowerShell будет обрабатывать этот файл либо в другом контексте как модуль, либо до загрузки модуля.

Чтобы устранить эту проблему Я удалил TypesToProcess из .psd1 и добавил Update-TypeData Types.ps1xml в качестве последней строки в мой модуль, таким образом, он будет запускаться автоматически при импорте модуля - и вуаля! Это работает.

TLDR : Если вы хотите зарегистрировать TypeConverter, определенный в классе PowerShell, вам нужно использовать Update-TypeData

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