升级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
相关产品推荐
相关产品推荐

