在powershell中将PSCustomObject转换为自定义类型

在powershell中将PSCustomObject转换为自定义类型,powershell,Powershell,有一个自定义类型,其定义如下: class User { public int Age { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 我必须将具有以下属性的PSCustomObject转换为User类型 @{ Age:12; FirstName:'John'; LastName:'Snow'; Addre

有一个自定义类型,其定义如下:

class User
{
    public int Age { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
我必须将具有以下属性的
PSCustomObject
转换为
User
类型

@{
    Age:12;
    FirstName:'John';
    LastName:'Snow';
    Address:'Whatev';
    Sex:'Male'
}
但每当我尝试将ps对象强制转换为如下自定义类型:
$john=[User]$psObj
我就会得到
InvalidCastConstructorException
。显然,它之所以出现是因为
PsCustomObject
User
类型支持的属性多得多

问题是:我们是否有一种简单的方法将此类
PSCustomObject
数据转换为自定义类型

另外,我必须支持powershell 5.1

我见过,但我有一个稍微不同的情况。我不局限于函数参数列表中的显式转换

更新 我想出了下一个函数

function Convert-PSCustomObjectToCustomType {
    param (
        [System.Reflection.TypeInfo]$customType,
        [PSCustomObject]$psCustomObj
    )

    $validObjProperties = @{}
    $customObjProperties = $customType.GetProperties() | ForEach-Object { $_.Name }
    foreach ($prop in $psCustomObj.PSObject.Properties) {
        if ($customObjProperties -contains $prop.Name) {
            $validObjProperties.Add($prop.Name, $prop.Value)
        }
    }

    return New-Object -TypeName $customType.FullName -Property $validObjProperties
}

在强制转换到目标类型时,可以使用哈希表文字作为初始值设定项:

#假设您的对象看起来像这样。。。
$object=[pscustomobject]@{
年龄=12
FirstName='John'
LastName='Snow'
地址='Whatev'
性别=‘男性’
}
# ... 您可以通过如下方式强制转换字典来初始化新实例的属性
$target=[用户]@{
年龄=$obj.Age
FirstName=$obj.FirstName
LastName=$obj.LastName
}

为了我自己的利益,我完全按照链接答案中的内容进行了操作,而且似乎对简单的演员阵容有效:

下面这样的运行代码应该为您提供“用户”类型

我不经常使用类,但我倾向于认为您也应该有一个更通用的构造函数:

User(
    [Int]$a,
    [string]$f,
    [string]$l
){
    $this.Age = $a
    $this.FirstName = $f
    $this.LastName = $l
}
这将有过载定义,如:

OverloadDefinitions
-------------------
User new(System.Object Object)
User new(int a, string f, string l)
我直接根据MS文档为第二个构造函数建模


注意:与函数一样,当传入的对象类型可能未知时,我经常对键入参数感到困惑。我在这里使用[PSObject]只是因为所有内容都是从[Object]派生而来的,我不想专门将输入范围缩小到PSCustomObject。同样地,我不怎么处理类,所以我乐于接受并对更正感兴趣。

这不是一个有效的JSON文档(前面的
@
不是JSON语法的一部分)-你从哪里/如何获得的?@MathiasR.Jessen抱歉,我的错。它实际上不是json。我已经更新了问题是的,这是一个有效的选择,它确实解决了我当前的问题。但我需要更具扩展性的东西。对象在将来可能会发生变化。我不想在所有代码库中更新它。谢谢,先生!PowerShell中定义的类的行为与普通的.NET类不同,问题似乎暗示这里正在使用它(因为它使用C#语法),但这一点值得澄清。请记住,这种方法假定OP完全控制(并有机会修改)目标类型。
OverloadDefinitions
-------------------
User new(System.Object Object)
User new(int a, string f, string l)