Как преобразовать PSCustomObject с дополнительными реквизитами в пользовательский класс - PullRequest
2 голосов
/ 10 октября 2019

Есть ли удобный способ преобразования PSCustomObject в пользовательский класс в качестве параметра функции в PowerShell 5.1? Пользовательский объект содержит дополнительные свойства.

Я хотел бы иметь возможность сделать что-то вроде этого:

class MyClass {
    [ValidateNotNullOrEmpty()][string]$PropA
}

$input = [pscustomobject]@{
    PropA          = 'propA';
    AdditionalProp = 'additionalProp';
}

function DuckTypingFtw {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $True, Position = 0, ValueFromPipeline)] [MyClass] $myObj
    )
    'Success!'
}

DuckTypingFtw $input

К сожалению, вместо Success! я получаю:

DuckTypingFtw: Невозможно обработать преобразование аргумента для параметра 'myObj'. Невозможно преобразовать значение "@ {PropA = propA; AdditionalProp = AdditionalProp}" в тип "MyClass". Ошибка: «Не удалось преобразовать» @ {PropA = propA;AdditionalProp = AdditionalProp} "значение
типа" System.Management.Automation.PSCustomObject "для ввода" MyClass "."В C: \ temp \ tmp.ps1: 23 char: 15 + DuckTypingFtw $ input + ~~~~~~ + CategoryInfo: InvalidData: (:) [DuckTypingFtw], ParameterBindingArgumentTransformationException + FullyQualifiedErrorId: ParameterArgumentTransformationE2ror

*3 * Duck

Если я закомментирую AdditionalProp, все будет работать нормально.

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

1 Ответ

0 голосов
/ 10 октября 2019

В вашем коде вы определяете два свойства для пользовательского объекта, но одно для класса. Вот почему вам нужно:

  • , чтобы добавить AdditionalProp в вашем классе
  • , чтобы удалить AdditionalProp из вашего PsCustomObject

Преобразование невозможно по замыслу.

...