如何将带有附加道具的 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
}
在 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 中添加
- 从您的 PsCustomObject 中删除
AdditionalProp
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
}