【问题标题】:Create instance of type with params argument in PowerShell在 PowerShell 中使用 params 参数创建类型实例
【发布时间】:2014-09-05 17:14:21
【问题描述】:

我正在尝试使用New-Object 在 PowerShell 中创建给定类型的实例。被实例化的类型的构造函数有一个 [string params] 类型的参数。例如,

public class Test
{
    public Test(params string[] data)
    {
        //
    }
}

如果我尝试使用以下命令实例化上述类型:

$ins = New-Object Test

我收到以下错误:

System.Management.Automation.PSargumentException:构造函数不是 成立。找不到适合类型的构造函数.....

实例化上述类型的正确方法是什么?我不想传递任何虚拟或空字符串作为输入参数。

以上示例代码仅用于演示目的。我要实例化的类是 Ninject 库中的 StandardKernel。类定义如下:

public class StandardKernel : KernelBase
{
    public StandardKernel(params INinjectModule[] modules)
      : base(modules)
    {
    }

    public StandardKernel(INinjectSettings settings, params INinjectModule[] modules)
      : base(settings, modules)
    {
    }
}

以下代码在 C# 中运行良好:

var kernel = new StandardKernel()

【问题讨论】:

  • 您的代码仍然没有默认构造函数。尝试添加一行public StandardKernel() : base() {}

标签: .net powershell powershell-3.0


【解决方案1】:

在更好地理解您的问题后,我不知道使用纯 PowerShell 创建对象的方法,但您可以创建一个 C# 方法来返回您想要的内容(请参阅下面的 NewTest 类型)。

$code1 = @'
public class Test
{
    public string arguments;

    public Test(params string[] data)
    {
        if(data != null) arguments = string.Join(", ", data);
    }
}
'@

$null = Add-Type -TypeDefinition $code1 -OutputAssembly c:\temp\Test.dll -PassThru

$code2 = @'
public class NewTest
{
    public static Test GetTest()
    {
        return new Test();
    }
}
'@

Add-Type -TypeDefinition $code2  -ReferencedAssemblies c:\temp\Test.dll

[NewTest]::GetTest()

【讨论】:

    【解决方案2】:

    除了@Rynant 指出的params 关键字问题之外,您的类构造函数需要一个参数,但在尝试实例化对象时您没有提供。

    你可以用一个空字符串来实例化对象来处理这个:

    $src = @"
    public class Test {
        public Test(params string[] data) {
            //...
        }
    }
    "@
    
    Add-Type -TypeDefinition $src
    $ins = New-Object Test ''
    

    或者你可以重载构造函数:

    $src = @"
    public class Test {
        public Test(params string[] data) {
            //...
        }
        public Test() : this("") {}
    }
    "@
    
    Add-Type -TypeDefinition $src
    $ins = New-Object Test
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 2020-01-09
      相关资源
      最近更新 更多