2014-07-01 18 views
5

Tôi có phương thức C# Tôi đang tải từ dll với các đối số chuỗi tùy chọn mặc định là null. Ví dụgọi phương thức C# từ PowerShell mà không cung cấp đối số tùy chọ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(); 
} 

Tôi muốn gọi này từ bên trong một kịch bản PowerShell và không cung cấp giá trị cho new_name nhưng một cho save_now. Theo this seemingly very similar question Tôi đã thử

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

nhưng kết quả này trong new_name được thiết lập như "System.Reflection.Missing" bên trong hàm.

Ngoài ra tôi đã cố gắng

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

nhưng kết quả này trong new_name được thiết lập để các chuỗi rỗng, vẫn không null. Tôi có thể thiết lập mặc định cho chuỗi rỗng, nhưng tôi đã tự hỏi nếu có bất kỳ cách nào tốt để thực sự có giá trị mặc định được sử dụng.

+1

Tôi khá chắc chắn bạn có thể xây dựng một cái gì đó để làm điều này với sự phản ánh. 'GetMethod' trả về một' MethodInfo', có phương thức 'GetProperty'. Nó trả về một 'ParameterInfo' có các thuộc tính' DefaultValue, HasDefaultValue và IsOptional'. Vì vậy, bạn có thể phát triển một chức năng PS, nói "InvokeWithNamedParameters" mô phỏng những gì VB hỗ trợ. –

+0

Ý tưởng thú vị. Đối với tôi tiếc là cửa sổ để thử giải pháp này đã trôi qua, nhưng có lẽ một người khác với cùng một câu hỏi sẽ thấy đây là một kỹ thuật khả thi. – irh

Trả lời

5

Không thể thực hiện trong PowerShell. Nó không hỗ trợ các tham số tùy chọn C#/VB. Đó là nhiệm vụ của ngôn ngữ gọi phương thức để cung cấp các giá trị mặc định khi lập trình viên không và PowerShell không thực hiện điều đó.

4

Bạn chỉ cần bỏ qua các tham số tùy chọn trong cuộc gọi. Tôi đã sửa đổi ví dụ của bạn để chạy nó trong PS. Ví dụ:

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

này tạo ra sau

test 
False 

thử nghiệm đã được thông qua một cách rõ ràng, null là null và không có đầu ra, và các save_now đánh giá để mặc định là True.

+0

Cảm ơn bạn đã trả lời, nhưng điều này vẫn còn nhớ câu hỏi của tôi. I * do * muốn cung cấp một giá trị cho tham số tùy chọn cuối cùng, nhưng không cung cấp giá trị trung bình. Ngoài ra, C# của tôi đang được nhập từ một dll, mặc dù tôi không biết nếu điều đó thay đổi mọi thứ. – irh

+1

Tôi hiểu ý của bạn bây giờ. Bạn có thể sử dụng [System.Management.Automation.Language.NullString] :: Value in v3 mà nên làm những gì bạn muốn. Powershell thích bỏ $ null để trở thành một chuỗi rỗng. Tài liệu tham khảo http://msdn.microsoft.com/en-us/library/system.management.automation.language.nullstring(v=vs.85).aspx và https://connect.microsoft.com/PowerShell/feedback/ chi tiết/307821/nó-isnt-có thể-to-pass-null-như-null-vào-một-net-phương pháp-có-có-một-tham số-of-type-string – StephenP

Các vấn đề liên quan