我遇到了这个问题:#24898
升级到 powershell 7.5.0 后,MemberwiseClone 丢失:
class MyClass {
[string]$Name
[object] CloneProblem() {
return $this.MemberwiseClone()
}
}
$obj = [MyClass]::new()
$obj.CloneProblem()
InvalidOperation:行 | 6 | 返回 $this.MemberwiseClone() # 失败,显示“不包含…| ~~~~~~~~~~~~~~~~~~~~~~~ | 方法调用失败,因为 [MyClass] 不包含名为“MemberwiseClone”的方法。
考虑到相关类可能具有多个派生类,这意味着我不希望在相关方法中对类类型进行硬编码,那么创建 PowerShell浅层复制方法替代方案最简洁和/或最高效的解决方法是什么。MyClass1 : MyClass { }
最快的方法是创建新对象并对所有现有成员进行硬编码。
如果类型有许多成员,最简洁但性能较差的方法是枚举访问
PSObject
成员的属性。或者,如果您不想在
return
语句中对类型进行硬编码,则可以使用LanguagePrimitives.ConvertTo
:另一种性能较差的方法是
MemberwiseClone
通过反射调用,理想情况下MethodInfo
应该将其缓存在static
字段中。对以前的方法的后续处理,可能有点过度,因为以前的方法在每种可能的情况下都应该足够了,可以将
Func<>
代表存储在每个派生的静态字典中。为了补充圣地亚哥的有用答案,其中展示了几种有用的技巧:
最简洁但性能不佳的解决方案是在每次调用时使用反射:
正如圣地亚哥的回答所指出的,为了获得高性能解决方案,您需要缓存通过反射获得的方法定义,以避免反射带来的性能损失。
为此,您可以利用这样的事实:可以直接在表示当前类实例的自动变量上使用静态
::
成员访问运算符。$this
这不仅比以类型文字 () 的形式重复类名更方便
[MyClass]
,而且还避免了对返回类型进行硬编码的问题,这会妨碍对类进行子类化(派生)。