Mam metodę C# ładuję z biblioteki dll opcjonalnymi argumentami łańcuchowymi, które domyślnie są null
. Na przykładwywołaj metodę C# z powłoki powershell bez podawania opcjonalnych argumentów.
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();
}
chcę zadzwonić to od wewnątrz skryptu PowerShell, a nie dostarczać wartość dla new_name
ale jeden dla save_now
. Zgodnie this seemingly very similar question Próbowałem
$default = [type]::Missing
$obj.foo($path, $default, $false)
ale to skutkuje new_name
jest ustawiony jako "System.Reflection.Missing"
wewnątrz funkcji.
Dodatkowo starałem
$obj.foo($path, $null, $false)
ale to skutkuje new_name
jest ustawiony na pusty ciąg, nadal nie null
. Mogłabym ustawić domyślny pusty ciąg znaków, ale zastanawiałem się, czy istnieje jakiś dobry sposób na wykorzystanie wartości domyślnej.
Jestem prawie pewna, że można zbudować coś, aby to zrobić z refleksją. 'GetMethod' zwraca" MethodInfo ", który ma metodę" GetProperty ". Zwraca 'ParameterInfo', który ma własności' DefaultValue, HasDefaultValue i IsOptional'. Abyś mógł rozwinąć funkcję PS, powiedz "InvokeWithNamedParameters", która emuluje to, co obsługuje VB. –
Interesujący pomysł. Niestety, niestety okno do wypróbowania tego rozwiązania minęło, ale być może ktoś inny z tym samym pytaniem uzna tę technikę za realną. – irh