2014-07-01 7 views
5

Ich habe eine C# -Methode, die ich von einer DLL mit optionalen String-Argumenten laden, die standardmäßig auf null. Zum BeispielC# -Methode aus Powershell aufrufen, ohne optionale Argumente zu liefern

public void foo(string path, string new_name = null, bool save_now = true) 
{ 
    if(name == null) 
     new_name = Path.GetFileNameWithoutExtension(path); 
    ... 
    if(save_now) 
     Save(); 
} 

Ich mag diese anrufen aus einem Powershell-Skript und keinen Wert für new_name sondern einen für save_now liefern. Wie pro this seemingly very similar question habe ich

versucht
$default = [type]::Missing 
$obj.foo($path, $default, $false) 

aber diese Ergebnisse in new_name als "System.Reflection.Missing" innerhalb der Funktion gesetzt werden.

Zusätzlich habe ich versucht,

$obj.foo($path, $null, $false) 

aber diese Ergebnisse in new_name auf die leere Zeichenfolge gesetzt wird, null noch nicht. Ich könnte den Standard auf die leere Zeichenfolge setzen, aber ich frage mich, ob es eine gute Möglichkeit gibt, den Standardwert tatsächlich zu verwenden.

+1

Ich bin mir ziemlich sicher, dass Sie etwas bauen könnten, um dies mit Reflexion zu tun. 'GetMethod' gibt eine' MethodInfo' zurück, die eine 'GetProperty' Methode hat. Es gibt eine 'ParameterInfo' mit den Eigenschaften 'DefaultValue, HasDefaultValue und IsOptional' zurück. Sie könnten also eine PS-Funktion entwickeln, sagen Sie "InvokeWithNamedParameters", die emuliert, was VB unterstützt. –

+0

Interessante Idee. Für mich ist leider das Fenster, um diese Lösung zu versuchen, vorbei, aber vielleicht findet jemand anderes mit der gleichen Frage eine brauchbare Technik. – irh

Antwort

5

Nein kann in PowerShell tun. Es unterstützt keine optionalen C#/VB-Parameter. Es ist die Aufgabe der Sprache, die die Methode aufruft, die Standardwerte zu liefern, wenn der Programmierer dies nicht tut und PowerShell dies nicht tut.

4

Sie können die optionalen Parameter im Aufruf einfach weglassen. Ich habe dein Beispiel modifiziert, um es in PS zu starten. Zum Beispiel:

$c = @" 
    public static class Bar { 
     public static void foo(string path, string new_name = null, bool save_now = true) 
     { 
      System.Console.WriteLine(path); 
      System.Console.WriteLine(new_name); 
      System.Console.WriteLine(save_now); 
     } 
    } 
"@ 

add-type -TypeDefinition $c 

[Bar]::Foo("test",[System.Management.Automation.Language.NullString]::Value,$false) 

Dies erzeugt die folgende

test 
False 

Der Test wurde explizit übergeben, null ist null und hatte keinen Ausgang, und die save_now auf die Standardeinstellung von True ausgewertet.

+0

Danke für die Antwort, aber das vermisst meine Frage immer noch. Ich * möchte * einen Wert für den letzten optionalen Parameter angeben, aber nicht den mittleren. Außerdem wird mein C# von einer DLL importiert, obwohl ich nicht weiß, ob das die Dinge ändert. – irh

+1

Ich sehe was du jetzt meinst. Sie können [System.Management.Automation.Language.NullString] :: Value in v3 verwenden, das tun sollte, was Sie wollen. Powershell möchte $ null als leere Zeichenfolge darstellen. Referenzen http://msdn.microsoft.com/en-us/library/system.management.automation.language.nallstring(v=vs.85).aspx und https://connect.microsoft.com/PowerShell/feedback/ Details/307821/Es ist nicht möglich, Null-als-Null-in-ein-Netz-Methode-das-hat-einen-Parameter-von-Typ-Zeichenfolge zu übergeben – StephenP