2014-07-01 20 views
5

Bir C# yönteminden, bir dll'den, null için varsayılan olan isteğe bağlı dize bağımsız değişkenleri ile yüklüyorum. Örneğinisteğe bağlı argümanlar sağlamadan powershell'den C# yöntemini çağırın

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(); 
} 

olsa hemen powershell komut dosyası içinden bu arayıp new_name ama save_now için biri için bir değer sağlamamaktadır istiyorum. this seemingly very similar question gereğince ben

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

denedi ama new_name bu sonuçları fonksiyonu içinde "System.Reflection.Missing" olarak ayarlanmıştır.

Ayrıca ben
$obj.foo($path, $null, $false) 

çalıştı ama new_name bu sonuçlar hala boş bir dizeye null değil ayarlanmıştır. Varsayılanı boş dizeye ayarlayabilirdim, ancak aslında varsayılan değerin kullanılmasının iyi bir yolu olup olmadığını merak ediyordum.

+1

Eminim ki bunu yansıma ile yapacak bir şey inşa edebilirsiniz. GetMethod, bir 'GetProperty' yöntemine sahip bir 'MethodInfo' döndürür. DefaultValue, HasDefaultValue ve IsOptional' özelliklerine sahip bir 'ParameterInfo' döndürür. Böylece bir PS işlevi geliştirebilir, VB'nin desteklediği şeyleri taklit eden "InvokeWithNamedParameters" deyin. –

+0

İlginç bir fikir. Benim için maalesef bu çözümü deneyen pencere geçti, ama belki de aynı soruya sahip bir başkası bu uygulanabilir bir teknik bulacaktır. – irh

cevap

5

PowerShell'de yapamazsınız. C#/VB isteğe bağlı parametreleri desteklemiyor. Programcının yapmadığı ve PowerShell'in bunu yapmadığı zaman, varsayılan değerleri sağlama yöntemini çağıran dilin görevidir.

4

Aramada isteğe bağlı parametreleri atlayabilirsiniz. Örneğini PS'de çalıştırmak için değiştirdim. Örneğin:

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

Bu, şu

test 
False 

Testi açıkça kabul edildi üretir boş boş ve hiçbir çıkış ve True varsayılan değerlendirilen save_now vardı.

+0

Cevabınız için teşekkürler, ancak bu yine de sorumu özlüyor. I * yapmak * son isteğe bağlı parametre için bir değer sağlamak istiyorum, ancak ortadaki değil. Ayrıca, C# 'leri bir dll'den içe aktarılıyor, ancak bazı şeylerin değişip değişmediğini bilmiyorum. – irh

+1

Şimdi ne demek istediğimi görüyorum. İstediğiniz şeyi yapması gereken [System.Management.Automation.Language.NullString] :: Değerini v3'te kullanabilirsiniz. Powershell boş bir dize olmak için $ null atmayı sever. Referanslar http://msdn.microsoft.com/en-us/library/system.management.automation.language.nullstring(v=vs.85).aspx ve https://connect.microsoft.com/PowerShell/feedback/ bilgilerini/307.821/o-isnt-muhtemel-için-pass-null olarak boş içine-a-ağ-yöntemi-o-sahip-bir parametre-of-tipi-string – StephenP

İlgili konular