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