2014-07-01 21 views
5

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.

+1

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

+0

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

Odpowiedz

5

Nie można zrobić w PowerShell. Nie obsługuje parametrów opcjonalnych C#/VB. Obowiązkiem języka wywołującego metodę jest dostarczenie wartości domyślnych, gdy programista tego nie robi, a PowerShell po prostu tego nie robi.

4

Można po prostu pominąć opcjonalne parametry w wywołaniu. Zmodyfikowałem twój przykład, aby uruchomić go na PS. Na przykład:

$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) 

ta generuje następujące

test 
False 

testowy został przekazany wyraźnie, null jest nieważna i nie miał wyjścia i save_now oceniona domyślnie true.

+0

Dzięki za odpowiedź, ale to nadal pomija moje pytanie. I * do * chcę podać wartość dla ostatniego opcjonalnego parametru, ale nie dla środkowego. Ponadto moje C# jest importowany z biblioteki dll, choć nie wiem, czy to zmienia rzeczy. – irh

+1

Widzę, co masz teraz na myśli. Możesz użyć [System.Management.Automation.Language.NullString] :: Wartość w wersji 3, która powinna zrobić to, co chcesz. Powershell lubi rzutować $ null jako pusty ciąg. Odnośniki http://msdn.microsoft.com/en-us/library/system.management.automation.language.nullstring(v=vs.85).aspx i https://connect.microsoft.com/PowerShell/feedback/ details/307821/it-isnt-possible-to-pass-null-as-null-into-a-net-method-to-ma-parametr-typu-string – StephenP

Powiązane problemy