如何将带有附加道具的 PSCustomObject 转换为自定义 class

How to convert PSCustomObject with additional props to a custom class

在 PowerShell 5.1 中,是否有一种巧妙的方法可以将 PSCustomObject 转换为自定义 class 作为函数参数? 自定义对象包含其他属性。

我希望能够做这样的事情:

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 : Cannot process argument transformation on parameter 'myObj'. Cannot convert value "@{PropA=propA; AdditionalProp=additionalProp}" to type "MyClass". Error: "Cannot convert the "@{PropA=propA; AdditionalProp=additionalProp}" value of
type "System.Management.Automation.PSCustomObject" to type "MyClass"." At C:\temp\tmp.ps1:23 char:15 + DuckTypingFtw $input + ~~~~~~ + CategoryInfo : InvalidData: (:) [DuckTypingFtw], ParameterBindingArgumentTransformationException + FullyQualifiedErrorId : ParameterArgumentTransformationError,DuckTypingFtw

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

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

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

  • 在您的 class
  • 中添加 AdditionalProp
  • 从您的 PsCustomObject
  • 中删除 AdditionalProp

设计上无法进行转换。

如果您为接受 pscustomobject 并通过 属性 的 MyClass class 创建一个构造函数,那么它应该可以工作:

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
}