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
$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.
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. –
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