从powershell调用C#方法而不提供可选参数

时间:2014-07-01 23:24:08

标签: c# powershell optional-parameters

我有一个c#方法我从一个带有可选字符串参数的dll加载,默认为null。例如

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

我想在一个powershell脚本中调用它,而不是为new_name提供一个值,而是为save_now提供一个值。根据{{​​3}}我已经尝试了

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

但这会导致new_name在函数中设置为"System.Reflection.Missing"

另外我试过

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

但这会导致new_name设置为空字符串,仍然不是null。我可以将默认值设置为空字符串,但我想知道是否有任何好方法可以使用默认值。

2 个答案:

答案 0 :(得分:5)

在PowerShell中无法做到。它不支持C#/ VB可选参数。调用该方法的语言的职责是在程序员没有提供默认值时,PowerShell就不会这样做。

答案 1 :(得分:4)

您可以简单地省略呼叫中的可选参数。我修改了你的例子在PS中运行它。例如:

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

这会生成以下内容

test
False

显式传递测试,null为null且没有输出,并且save_now评估为默认值True。