在不提供可选参数的情况下从powershell调用C#方法
我有一个c#方法,我正在从一个dll加载,它带有可选的字符串参数,默认为在不提供可选参数的情况下从powershell调用C#方法,c#,powershell,optional-parameters,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(); } 我希望从p
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\u name
提供值,而是为save\u now
提供值。据我所知,我已经试过了
$default = [type]::Missing
$obj.foo($path, $default, $false)
但这会导致函数中的新\u名称
被设置为“System.Reflection.Missing”
另外我也试过了
$obj.foo($path, $null, $false)
但这会导致
new_name
被设置为空字符串,但仍然不是null
。我可以将默认值设置为空字符串,但我想知道是否有什么好方法可以实际使用默认值。您只需在调用中省略可选参数即可。我修改了您的示例以在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_现在计算为默认值True。在PowerShell中无法执行。它不支持C#/VB可选参数。调用该方法的语言有责任在程序员不提供默认值而PowerShell不提供默认值的情况下提供默认值。谢谢您的回复,但这仍然忽略了我的问题。我确实想为最后一个可选参数提供一个值,但不是中间的参数。另外,我的C#正在从dll导入,尽管我不知道这是否会改变情况。我现在明白你的意思了。您可以在v3中使用[System.Management.Automation.Language.NullString]::值,该值应该满足您的需要。Powershell喜欢将$null强制转换为空字符串。引用,我很确定你可以用反射来构建一些东西
GetMethod
返回一个MethodInfo
,它有一个GetProperty
方法。它返回一个ParameterInfo
,它具有DefaultValue、HasDefaultValue和IsOptional
属性。所以你可以开发一个PS函数,比如“InvokeWithNamedParameters”,它模拟VB支持的功能。这个想法很有趣。不幸的是,对我来说,尝试这个解决方案的机会已经过去了,但也许其他有同样问题的人会发现这是一种可行的技术。