Mic*_*ter 8 .net powershell overloading reference
我知道Powershell可以调用.NET代码,它可能看起来像这样
PS> [Reflection.Assembly]::LoadFile(($ScriptDir + ".\SharpSvn-x64\SharpSvn.dll"))
PS> $SvnClient = New-Object SharpSvn.SvnClient
Run Code Online (Sandbox Code Playgroud)
而且我知道在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...)
Run Code Online (Sandbox Code Playgroud)
我知道在C#中你可以重载函数,就像SharpSvn库为它的SvnClient.Update()方法做的那样:
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)修订路径但是,如果我们想把所有这些放在一起呢?比方说,如果我想调用第6个版本Update(),它是一个带有String和SvnUpdateResult的版本,其中SvnUpdateResult是一个C#out对象?我的第一直觉是尝试这样的事情:
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
Run Code Online (Sandbox Code Playgroud)
好吧,也许我必须提出论点?
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
Run Code Online (Sandbox Code Playgroud)
但这似乎也不起作用.我试过的其他事情:
$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"类型.看起来像两次投射是问题 - 最终的施法只是覆盖了第一次施法,他们没有相互补充.这是发生了什么?有没有办法投两次?还有另一种解决这个问题的方法吗?
在此先感谢您的帮助.
这可能不是一个理想的解决方案,但您可以使用 Add-Type 并创建一个对 PowerShell 更友好的类型来包装 Update 方法。
Add-Type -TypeDefinition "
public class SvnClientEx
{
public static SvnUpdateResult Update(SvnClient client, string path)
{
SvnUpdateResult result;
client.Update(path, out result);
return result;
}
}
"
$result = [SvnClient]::Update($svnClient, $repopath)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2208 次 |
| 最近记录: |