You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell 5.1中如何将多属性PSCustomObject转换为自定义类型

将带额外属性的PSCustomObject转成自定义.NET类型(PowerShell 5.1)

这个问题我之前也踩过坑——当你的PSCustomObject带着目标自定义.NET类型(比如你写的User类)没有的属性时,直接用[User]$psObj强制转换肯定会抛出InvalidCastConstructorException,毕竟PowerShell找不到能匹配所有属性的构造函数。

你自己写的Convert-PSCustomObjectToCustomType函数已经是个非常靠谱的解决方案了,核心逻辑就是只保留PSCustomObject里和目标类型匹配的属性,再用这些有效属性去实例化目标类型。下面我把这个方案整理得更清晰,再补个使用示例:

完整可运行代码

# 先定义你的自定义User类型
class User {
    public int Age { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

# 通用转换函数
function Convert-PSCustomObjectToCustomType {
    param (
        [System.Reflection.TypeInfo]$customType,
        [PSCustomObject]$psCustomObj
    )

    # 先拿到目标类型支持的所有属性名
    $customObjProperties = $customType.GetProperties() | ForEach-Object { $_.Name }
    
    # 筛选PSCustomObject里和目标类型匹配的属性
    $validObjProperties = @{}
    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
}

实际使用示例

# 创建带额外属性的PSCustomObject
$psObj = [PSCustomObject]@{
    Age = 12
    FirstName = 'John'
    LastName = 'Snow'
    Address = 'Whatev'
    Sex = 'Male'
}

# 转换为User类型
$john = Convert-PSCustomObjectToCustomType -customType ([User]) -psCustomObj $psObj

# 验证转换结果
$john | Get-Member
# 输出只会显示Age、FirstName、LastName三个属性,完全符合User类的定义

为什么这个方案可行?

  1. 属性筛选逻辑:通过反射拿到目标.NET类型的所有属性名,再遍历PSCustomObject的属性,只保留两者名称一致的键值对,自动忽略额外属性。
  2. 灵活实例化:用New-Object配合筛选后的属性哈希表创建实例,PowerShell会自动把哈希表里的键值对匹配到目标类型的属性上赋值,不需要你手动写构造函数,通用性拉满。

这个方案完全兼容PowerShell 5.1,而且不局限于特定类型——只要传入对应的类型信息,任何自定义.NET类型和PSCustomObject的转换都能搞定。

内容的提问来源于stack exchange,提问作者managerger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:27:55