【发布时间】:2012-12-19 18:42:47
【问题描述】:
我知道 Powershell 可以调用 .NET 代码,可能看起来像这样
PS> [Reflection.Assembly]::LoadFile(($ScriptDir + ".\SharpSvn-x64\SharpSvn.dll"))
PS> $SvnClient = New-Object SharpSvn.SvnClient
而且我知道 C# 有 out 参数,Powershell 有 [ref] 参数,可能看起来像这样:
PS> $info = $null
PS> $SvnClient.GetInfo($repo.local, ([ref]$info))
True
PS> $info
(...long output snipped...)
NodeKind : Directory
Revision : 16298
Uri : http://server/path/to/remoterepo
FullPath : C:\path\to\localrepo
(...long output snipped...)
而且我知道在 C# 中您可以重载函数,就像 SharpSvn 库对其 SvnClient.Update() method 所做的那样:
-
Update(ICollection(String))- 将指定路径递归更新到最新 (HEAD) 修订版 -
Update(String)- 将指定路径递归更新到最新 (HEAD) 修订版 -
Update(ICollection(String), SvnUpdateArgs)- 将指定路径更新到指定修订版 -
Update(ICollection(String), SvnUpdateResult)- 将指定路径递归更新到最新 (HEAD) 修订版 -
Update(String, SvnUpdateArgs)- 递归更新指定路径 -
Update(String, SvnUpdateResult)- 以递归方式将指定路径更新为最新 (HEAD) 修订版 -
Update(ICollection(String), SvnUpdateArgs, SvnUpdateResult)- 将指定路径更新到指定修订版 -
Update(String, SvnUpdateArgs, SvnUpdateResult)- 以递归方式将指定路径更新为最新 (HEAD) 修订版
但是,如果我们想把所有这些放在一起怎么办?例如,如果我想调用Update() 的第 6 个版本,它接受一个字符串和一个 SvnUpdateResult,其中 SvnUpdateResult 是一个 C# 输出对象?我的第一直觉是尝试这样的事情:
PS> $repopath = "C:\path\to\localrepo"
PS> $update = $null
PS> $svnclient.update($repopath, [ref]$update)
Multiple ambiguous overloads found for "Update" and the argument count: "2".
At line:1 char:18
+ $svnclient.update <<<< ($repopath, [ref]$update)
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
好的,也许我必须转换参数?
PS> $svnclient.update([string]$repopath, [ref][SharpSvn.SvnUpdateResult]$update)
Multiple ambiguous overloads found for "Update" and the argument count: "2".
At line:1 char:18
+ $svnclient.update <<<< ([string]$repopath, [ref][SharpSvn.SvnUpdateResult]$update)
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
但这似乎也不起作用。我尝试过的其他事情:
- 将
$update转换为[SharpSvn.SvnUpdateResult][ref]- 也就是说,颠倒我的转换顺序。这会导致错误提示:“[ref] 只能是类型转换序列中的最终类型。” - 在使用之前将
$update转换为SharpSvn.SvnUpdateResult:$update = [SharpSvn.SvnUpdateResult]$null。这会导致我在上面遇到的相同的“多个不明确的重载”错误 - 在使用之前将
$update转换为ref:$update = [ref]$null。这会导致错误:“无法将“System.Management.Automation.PSReference”类型的“System.Management.Automation.PSReference”值转换为“SharpSvn.SvnUpdateResult”类型。'
似乎两次施法是个问题——最后一次施法只是覆盖了第一次施法,它们不会相互补充。这是怎么回事?有没有办法两次施放东西?有没有其他方法可以解决这个问题?
提前感谢您的帮助。
【问题讨论】:
-
我发现您可以使用
$svnclient.Update.OverloadedDefinitions检查重载的定义,但我无法从那里调用它们。 -
深入了解 PowerShell 的类型转换/成员解析内部工作的一种方法是运行
Trace-Command -Name All -Expression {$svnclient.update($repopath, [ref]$update)} -PSHost并查看是否有任何有用的信息。 -
不幸的是,这会返回相同的“多重模糊重载”消息。
-
我为这个问题创建了一个简单的重现,并为 PowerShell 创建了filed an issue。
标签: .net powershell reference overloading