【问题标题】:PowerShell, Extension Methods, and Monkey PatchingPowerShell、扩展方法和猴子补丁
【发布时间】:2009-05-11 02:28:18
【问题描述】:

是否可以在 PowerShell 中编写扩展方法?还是在现有类型(如 [string] 运行时存在)之上添加一个新方法?

【问题讨论】:

    标签: .net powershell extension-methods monkeypatching


    【解决方案1】:

    如果您有要添加到特定类型的方法或属性,可以通过 PowerShell 的自适应类型系统创建自定义类型扩展。

    自定义类型扩展是一个 XML 文件,用于描述类型的属性或脚本方法,然后通过 Update-TypeData cmdlet 将其加载到 PowerShell 会话中。

    可以在PowerShell Team Blog - Hate Add-Member? (PowerShell's Adaptive Type System to the Rescue) 上找到一个很好的例子

    【讨论】:

    • 是的,这就是原始发帖人正在寻找的答案。
    • 我确实偶然发现了这种方法。没有把握。我想尽可能多地保留在 PowerShell 与 XML 中。嗯。如果我有很多“模组”要做,我想我会使用这种方法。
    【解决方案2】:

    我不知道用扩展方法修补类型的方法。但当然可以通过 add-member cmdlet 修补对象

    PS> $a = "foo"
    PS> $a = add-member -in $a -memberType ScriptMethod -name Bar -value { $this + "bar" } -passthru
    PS> $a.Foo()
    foobar
    

    编辑解释完全可读的 PowerShell 语法:)

    我喜欢 PowerShell,但它确实时不时会想出一些神秘的语法。

    • “-in”:这是 inputObject 的缩写,本质上表示向此添加成员
    • “-memberType”:您可以向运行时对象添加许多不同类型的值,包括方法、注释属性、代码方法等……完整列表请参见“get-help add-member -full”
    • “-passthru”:获取刚刚添加了成员​​的对象并将其推送到管道中。如果没有此标志,则分配将分配给 $a 并将管道清空。
    • 赋值调用基本上是确保$a现在有你添加的方法

    【讨论】:

    • +1 你能详细说明一下语法吗? $a = add-member 看起来有点奇怪,-in 和 -passthru 开关有什么作用?
    • Add-Member 也适用于管道 PS> $a = "foo" PS> $a | add-member -memberType ScriptMethod -name Bar -value { $this + "bar" } PS> $a.Foo() foobar
    • @JaredPar:几个问题:“$a = Add-Member”似乎使“$a = $null”。成员类型不应该是“ScriptProperty”并且调用“$a.Bar()”吗?我一定是遗漏了一些东西,但我只有通过改变所有这些(PS V1)才能做到这一点。
    • 嗯,廷德尔想要的是方法,而不是属性。
    • 非常正确。我错过了“-passthru”开关......但是,当新方法被命名为 Bar() 时,我仍然不明白调用 Foo() 的意义是什么...... :-?
    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 2023-03-27
    • 2012-07-26
    • 2016-09-01
    • 2012-09-16
    • 2012-12-18
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多