在PowerShell中使用params参数创建类型的实例

时间:2014-07-15 13:22:23

标签: .net powershell powershell-v3.0

我正在尝试使用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()

2 个答案:

答案 0 :(得分:3)

在更好地理解您的问题之后,我不知道使用纯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()

答案 1 :(得分:1)

除了@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