Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

call C# method from powershell without supplying optional arguments

I have a c# method I am loading from a dll with optional string arguments that default to null. For example

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

I want to call this from within a powershell script and not supply a value for new_name but one for save_now. As per this seemingly very similar question I have tried

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

but this results in new_name being set as "System.Reflection.Missing" within the function.

Additionally I tried

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

but this results in new_name being set to the empty string, still not null. I could set the default to the empty string, but I was wondering if there was any good way to actually have the default value be used.

like image 952
irh Avatar asked Jul 01 '14 23:07

irh


2 Answers

No can do in PowerShell. It doesn't support C#/VB optional parameters. It is the duty of the language calling the method to provide the default values when the programmer doesn't and PowerShell just doesn't do that.

like image 152
Keith Hill Avatar answered Sep 30 '22 03:09

Keith Hill


You can simply omit the optional parameters in the call. I modified your example to run it in PS. For example:

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

This generates the following

test
False

Test was passed explicitly, null is null and had no output, and the save_now evaluated to the default of True.

like image 31
StephenP Avatar answered Sep 30 '22 03:09

StephenP