【问题标题】:call C# method from powershell without supplying optional arguments从 powershell 调用 C# 方法而不提供可选参数
【发布时间】:2014-08-22 15:03:14
【问题描述】:

我有一个 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 提供一个值。按照this seemingly very similar question我试过了

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

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

另外我试过了

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

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

【问题讨论】:

  • 我很确定您可以通过反射构建一些东西来做到这一点。 GetMethod 返回一个MethodInfo,它有一个GetProperty 方法。它返回一个具有DefaultValue, HasDefaultValue, and IsOptional 属性的ParameterInfo。所以你可以开发一个 PS 函数,比如模拟 VB 支持的“InvokeWithNamedParameters”。
  • 有趣的想法。不幸的是,对我来说,尝试这个解决方案的窗口已经过去了,但也许有同样问题的其他人会发现这是一种可行的技术。

标签: c# powershell optional-parameters


【解决方案1】:

在 PowerShell 中无能为力。它不支持 C#/VB 可选参数。调用方法的语言有责任在程序员不提供默认值时提供默认值,而 PowerShell 只是不这样做。

【讨论】:

    【解决方案2】:

    您可以简单地省略调用中的可选参数。我修改了您的示例以在 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。

    【讨论】:

    • 感谢您的回复,但这仍然错过了我的问题。我确实想为最后一个可选参数提供一个值,但不是中间那个。另外,我的 C# 是从 dll 导入的,但我不知道这是否会改变。
    • 我明白你的意思了。您可以在 v3 中使用 [System.Management.Automation.Language.NullString]::Value ,它应该可以满足您的需求。 Powershell 喜欢将 $null 转换为空字符串。参考 msdn.microsoft.com/en-us/library/…connect.microsoft.com/PowerShell/feedback/details/307821/…
    猜你喜欢
    • 2021-02-03
    • 2013-07-03
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多