Reputation: 358
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.
Upvotes: 5
Views: 3259
Reputation: 201822
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.
Upvotes: 5
Reputation: 4081
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.
Upvotes: 4