我可以在网上找到关于这样做的所有内容是覆盖cmdlet,但我需要覆盖一个Windows窗体事件。这是我需要的C#等价物:
protected override Point ScrollToControl(Control activeControl)
{
return this.AutoScrollPosition;
}
他们说你只是在相同的范围内使用该功能的名称,它会自动覆盖它,但这对我不起作用。
答案 0 :(得分:6)
If you're referring to a method, Chris Dent's answer covers that nicely!
对于本机PowerShell cmdlet /函数,我将在此处复制my answer from ServerFault:
是的,您可以在Powershell中覆盖Get-ChildItem
或任何其他cmdlet。
如果在同一范围内创建具有相同名称的函数,则将使用您的函数。
实施例:
Function Get-ChildItem {
[CmdletBinding()]
param(
# Simulate the parameters here
)
# ... do stuff
}
创建自己的函数,然后为该函数创建一个别名,其名称与要覆盖的cmdlet同名。
示例:
Function My-GetChildItem {
[CmdletBinding()]
param(
# Simulate the parameters here
)
# ... do stuff
}
New-Alias -Name 'Get-ChildItem' -Value 'My-GetChildItem' -Scope Global
这种方式很好,因为在不踩踏内置函数的情况下测试函数更容易,并且可以控制cmdlet何时被覆盖或不在代码中。
删除别名:
Remove-Item 'Alias:\Get-ChildItem' -Force
about_Command_Precedence列出了解释不同类型命令的顺序:
如果未指定路径,Windows PowerShell将使用以下命令 运行命令时的优先顺序:
- 别名
- 功能
- Cmdlet
- 原生Windows命令
醇>
答案 1 :(得分:2)
您需要覆盖类而不是函数的方法。
您可以使用脚本块覆盖它(我对未公开的基于表单的类做了很多,所以这是猜测)。
Force参数将让Add-Member替换一个方法,具体取决于类中的保护/访问修饰符。例如,这种方法适用于覆盖ToString。
$baseObject | Add-Member Point -MemberType ScriptMethod -Value { return $this.AutoScrollPosition } -Force