Ich weiß, dass Powershell .NET-Code aufrufen kann, der so aussehen könnte
%Vor% Und ich weiß, dass, wo C # out
Argumente hat, Powershell [ref]
Argumente hat, was wie folgt aussehen könnte:
Und ich weiß, dass Sie in C # Funktionen überladen können, wie die SharpSvn-Bibliothek für ihre SvnClient.Update () Methode :
Update(ICollection(String))
- Aktualisiert die angegebenen Pfade rekursiv auf die neueste (HEAD) Revision Update(String)
- Aktualisiert den angegebenen Pfad rekursiv auf die letzte (HEAD) Revision Update(ICollection(String), SvnUpdateArgs)
- Aktualisiert die angegebenen Pfade auf die angegebene Version Update(ICollection(String), SvnUpdateResult)
- Aktualisiert die angegebenen Pfade rekursiv auf die neueste (HEAD) Revision Update(String, SvnUpdateArgs)
- Aktualisiert den angegebenen Pfad rekursiv Update(String, SvnUpdateResult)
- Aktualisiert den angegebenen Pfad rekursiv auf die letzte (HEAD) Revision Update(ICollection(String), SvnUpdateArgs, SvnUpdateResult)
- Aktualisiert die angegebenen Pfade auf die angegebene Version Update(String, SvnUpdateArgs, SvnUpdateResult)
- Aktualisiert den angegebenen Pfad rekursiv auf die letzte (HEAD) Revision Aber was, wenn wir das alles zusammenfügen wollen? Wenn ich zum Beispiel die 6. Version von Update()
aufrufen möchte, diejenige, die einen String und ein SvnUpdateResult verwendet, wobei SvnUpdateResult ein C # out-Objekt ist? Mein erster Instinkt war, so etwas zu versuchen:
OK, vielleicht muss ich die Argumente werfen?
%Vor%Aber das scheint auch nicht zu funktionieren. Andere Dinge, die ich versucht habe:
$update
als [SharpSvn.SvnUpdateResult][ref]
- das heißt, die Reihenfolge, in der ich sie gewirkt habe, wird umgekehrt. Dies führt zu einem Fehler, der besagt: "[ref] kann nur der letzte Typ in der Typumwandlungsfolge sein." $update
bis SharpSvn.SvnUpdateResult
vor der Verwendung: $update = [SharpSvn.SvnUpdateResult]$null
. Dies führt zu demselben Fehler "Mehrere mehrdeutige Überladungen", auf den ich oben hingewiesen habe $update
bis ref
vor der Verwendung: $update = [ref]$null
. Dies führt zu einem Fehler: 'Der Wert "System.Management.Automation.PSReference" des Typs "System.Management.Automation.PSReference" kann nicht in "SharpSvn.SvnUpdateResult" geschrieben werden.' Es sieht so aus, als ob es zweimal geworfen wurde - das Finale überlagert die erste Besetzung, sie ergänzen sich nicht. Ist das was passiert? Gibt es eine Möglichkeit, etwas zweimal zu werfen? Gibt es einen anderen Weg, um dieses Problem zu umgehen?
Vielen Dank im Voraus für jede Hilfe.
Das scheint ziemlich schwer zu sein.
Welche Version von PowerShell ist das?
Sind SvnUpdateArgs
und SvnUpdateResult
verwandt (d. H. Eine Klasse ist von der anderen abgeleitet)? Ich nehme nicht an.
Basierend auf einem ähnlichen Szenario, das ich mit der aktuellen Version (4.0) von PowerShell erstellt habe, funktioniert das, denke ich:
%Vor% Allerdings konnte ich nur mit einer der Überladungen arbeiten!? Nicht sicher, ob es zufällig ist, aber das war die Überlastung, die zuerst aufgeführt wurde, als ich $svnclient.Update
ansprach Siehe die Überladungsdefinitionen.
Wenn ich in meiner Version von PowerShell das zweite Argument als [ref][SharpSvn.SvnUpdateResult]$update
gebe, scheint die Überladung korrekt gelöst zu sein, die Methode läuft ohne Fehler, aber das dem Parameter "out" zugewiesene Objekt scheint verloren zu sein / p>
Auch wenn $repopath
typsicher deklariert ist als [string]$repopath = "C:\path\to\localrepo"
, müssen wir noch [string]$repopath
sagen, wenn wir es übergeben (nach Wert).
Es scheint ein Problem in PowerShell zu geben, wenn es eine Methode gibt, die Sie mit einem out-Parameter einer Klasse aufrufen, und eine andere Überladung mit einer ähnlichen Signatur (die Klasse kann jede Klasse in dieser Signatur sein.)
Ich habe für dieses Problem eine einfache Repro erstellt und ein Problem für PowerShell gemeldet.
Dies ist möglicherweise keine ideale Lösung, aber Sie könnten Add-Type verwenden und einen PowerShell-freundlichen Typ erstellen, der die Update-Methode umschließt.
%Vor%Sie können einfach einen Codeblock verwenden und auf das Ergebnisobjekt in diesem Block zugreifen:
%Vor%Tags und Links .net reference powershell method-overloading