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

升级PowerShell 7.5.0后MemberwiseClone缺失的最优浅拷贝替代方案

替代方案:PowerShell自定义类浅拷贝(支持派生类)

针对PowerShell 7.5.0中自定义类缺失MemberwiseClone方法的问题,以下是两种支持派生类、无需硬编码类类型的浅拷贝方案:

方案1:使用PSObject.Copy()(简洁优先)

PowerShell所有对象都自带PSObject属性,其Copy()方法会创建对象的浅拷贝,自动适配当前实例的实际类型(包括派生类),代码最简洁:

class MyClass {
    [string]$Name

    [object] Clone() {
        return $this.PSObject.Copy()
    }
}

# 派生类示例
class MyClass1 : MyClass {
    [int]$Age
}

# 测试
$obj = [MyClass1]::new()
$obj.Name = "Alice"
$obj.Age = 30
$clone = $obj.Clone()

# 验证浅拷贝:修改原对象值类型属性,克隆对象不受影响
$obj.Age = 31
$clone.Age # 输出30

方案2:反射调用原生MemberwiseClone(性能优先)

虽然PowerShell自定义类表面未暴露MemberwiseClone,但底层仍是.NET对象,可通过反射调用原生的非公开MemberwiseClone方法,性能更接近原生实现:

class MyClass {
    [string]$Name

    [object] Clone() {
        # 反射获取并调用Object的MemberwiseClone方法
        return [System.Object].GetMethod(
            'MemberwiseClone', 
            [System.Reflection.BindingFlags]'Instance, NonPublic'
        ).Invoke($this, $null)
    }
}

# 派生类示例
class MyClass1 : MyClass {
    [int]$Age
}

# 测试
$obj = [MyClass1]::new()
$obj.Name = "Bob"
$obj.Age = 25
$clone = $obj.Clone()

$obj.Age = 26
$clone.Age # 输出25

方案对比

  • 简洁性:PSObject.Copy()更胜一筹,代码量少、可读性高。
  • 性能:反射调用原生方法更高效,适合频繁拷贝的场景。
  • 兼容性:两种方案均支持所有PowerShell自定义类(包括派生类),无需修改派生类代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:00:01