2

是否有一种巧妙的方法可以将 a 转换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 : ParameterArgumentTransformationError,DuckTypingFtw

如果我注释掉AdditionalProp,一切正常。

基本上,我想要实现的是从一个函数返回一个对象并将其传递给第二个函数,同时确保第二个函数的参数具有所有预期的属性。

4

2 回答 2

3

如果您为接受 pscustomobject 并传递属性的 MyClass 类创建构造函数,那么应该可以:

class MyClass {
    MyClass([pscustomobject]$object){
        $this.PropA = $object.PropA
    }
    [ValidateNotNullOrEmpty()][string]$PropA
}

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

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

DuckTypingFtw $input

编辑:如果您还想在其他地方使用 MyClass,请为 MyClass 添加一个默认构造函数,例如:

class MyClass {
    MyClass() { } 
    MyClass([pscustomobject]$object){
        $this.PropA = $object.PropA
    }
    [ValidateNotNullOrEmpty()][string]$PropA
}
于 2020-03-19T12:05:28.907 回答
-1

在您的代码中,您为自定义对象定义了两个属性,但为类定义了一个。这就是为什么你需要:

  • 添加AdditionalProp到你的班级
  • AdditionalProp从您的 PsCustomObject中删除

设计上不可能进行转换。

于 2019-10-10T20:06:29.510 回答