从powershell调用c#方法而不提供可选参数
本文关键字:参数 powershell 调用 方法 | 更新日期: 2023-09-27 18:11:07
我有一个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
提供一个值。根据这个看似非常相似的问题,我试过
$default = [type]::Missing
$obj.foo($path, $default, $false)
,但这会导致new_name
在函数中被设置为"System.Reflection.Missing"
。
另外我试过
$obj.foo($path, $null, $false)
,但这导致new_name
被设置为空字符串,仍然不是null
。我可以将默认值设置为空字符串,但我想知道是否有任何好的方法来实际使用默认值。
在PowerShell中不能这样做。它不支持c#/VB的可选参数。当程序员不提供默认值时,调用方法的语言有责任提供默认值,而PowerShell就是不这样做。
您可以简单地省略调用中的可选参数。我修改了您的示例,以便在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
Test显式通过,null为null,没有输出,save_now求值为默认值True。