在不提供可选参数的情况下从powershell调用C#方法

在不提供可选参数的情况下从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

我有一个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\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支持的功能。这个想法很有趣。不幸的是,对我来说,尝试这个解决方案的机会已经过去了,但也许其他有同样问题的人会发现这是一种可行的技术。