如何调用使用Powershell的C#out参数的重载.NET函数?

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()方法做的那样:

  1. Update(ICollection(String)) - 递归更新指定的路径到最新(HEAD)修订版
  2. Update(String) - 递归更新指定的最新(HEAD)修订路径
  3. Update(ICollection(String), SvnUpdateArgs) - 更新指定修订的指定路径
  4. Update(ICollection(String), SvnUpdateResult) - 递归更新指定的路径到最新(HEAD)修订版
  5. Update(String, SvnUpdateArgs) - 递归更新指定的路径
  6. Update(String, SvnUpdateResult) - 递归更新指定的最新(HEAD)修订路径
  7. Update(ICollection(String), SvnUpdateArgs, SvnUpdateResult) - 更新指定修订的指定路径
  8. 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]只能是类型转换序列中的最终类型."
  • 铸造$updateSharpSvn.SvnUpdateResult使用它之前:$update = [SharpSvn.SvnUpdateResult]$null.这导致我遇到上述相同的"多个模糊过载"错误
  • 铸造$updateref使用它之前:$update = [ref]$null.这会导致错误:'无法将"System.Management.Automation.PSReference"类型的"System.Management.Automation.PSReference"值转换为"SharpSvn.SvnUpdateResult"类型.

看起来像两次投射是问题 - 最终的施法只是覆盖了第一次施法,他们没有相互补充.这是发生了什么?有没有办法投两次?还有另一种解决这个问题的方法吗?

在此先感谢您的帮助.

Ada*_*oll 1

这可能不是一个理想的解决方案,但您可以使用 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)