Powershell集合类构造函数

Powershell集合类构造函数,powershell,class,constructor,initialization,Powershell,Class,Constructor,Initialization,我一直在从事一个脚本项目,该项目涉及创建自定义PowerShell类。我目前正在尝试理解以下语法 $Temp = [myclass[]]::new(1) $Temp=[myclass[]]::新建(1) 这种语法似乎创建了某种类型的通用列表,我可以在其中指定列表的大小。我有没有办法修改这个构造函数?理想情况下,我想做如下工作: [string[]]$ClassData = @('test1','test2','test3') [myclass[]]$Temp = [myclass[]]::new

我一直在从事一个脚本项目,该项目涉及创建自定义PowerShell类。我目前正在尝试理解以下语法

$Temp = [myclass[]]::new(1) $Temp=[myclass[]]::新建(1) 这种语法似乎创建了某种类型的通用列表,我可以在其中指定列表的大小。我有没有办法修改这个构造函数?理想情况下,我想做如下工作:

[string[]]$ClassData = @('test1','test2','test3') [myclass[]]$Temp = [myclass[]]::new($ClassData) [string[]]$ClassData = @('test1','test2','test3') [myclass[]]$Temp = @($ClassData | [myclass[]]::new($_)) [string[]$ClassData=@('test1','test2','test3')) [myclass[]]$Temp=[myclass[]]::新建($ClassData) 这将为$ClassData中的每个项调用myclass的构造函数。不幸的是,这不是它目前的工作方式,我一直在使用以下方法解决这一问题:

[string[]]$ClassData = @('test1','test2','test3') [myclass[]]$Temp = [myclass[]]::new($ClassData) [string[]]$ClassData = @('test1','test2','test3') [myclass[]]$Temp = @($ClassData | [myclass[]]::new($_)) [string[]$ClassData=@('test1','test2','test3')) [myclass[]$Temp=@($ClassData |[myclass[]]::新建($|))
关于如何完成所有这些工作的任何帮助或解释都将不胜感激。

注意:我假设您的工作示例打算使用
[myclass]::new($)
,而不是
[myclass[]]::new($)
,也就是说,您正在每个循环迭代中创建一个
[myclass]
实例:
@($ClassData){[myclass]::新建($\u00})


不要试图将初始化值数组传递给静态
::new()
方法(即,传递给幕后的构造函数),而是将其强制转换为

[myclass[]]$Temp = $ClassData
请注意,
[myclass[]]
是一个类型为
[myclass]
的实例数组,如果
[myclass]::new($\u)
与表示单个字符串的
$\u
一起工作,则上述转换应成功

本质上,PowerShell将在幕后执行基于循环的解决方案明确执行的操作


至于你所尝试的

[myclass[]]$Temp = $ClassData
[myclass[]::new($ClassData)
不起作用,因为
[array]
System.array
)没有接受现有数组以初始化新数组的构造函数;唯一的构造函数是接受数组大小(长度、元素计数)的构造函数,您可以按如下方式验证:

PS> [object[]]::new

OverloadDefinitions
-------------------
System.Object[] new(int )

可选阅读:从哈希表/自定义对象强制转换:

例如,类型转换非常灵活,比C#中的灵活得多

即使输入类型不能直接转换为目标类型,并且目标类型没有输入类型的单参数构造函数,如果满足以下所有条件,PowerShell仍然能够构造目标类型的实例:

  • 目标类型具有无参数的公共构造函数。[1]
  • 输入类型与目标类型或其子集具有相同的属性集
  • 所有重叠属性本身都是类型兼容的(属性属于同一类型,或者可以从输入属性类型转换为目标属性类型)
下面是一个从包含哈希表和自定义对象(
[pscustomobject]
)的数组初始化自定义类数组的示例(使用PSv5+
类定义),每个数组都提供目标类型属性的子集

# Define a class.
# Not defining a constructor explicitly implicitly defines
# a public, parameter-less one.
class Foo {
  [string] $Bar
  [int]    $Baz
}

# Create an array of [Foo] instances via initialization by a
# hashtable and a custom object.
[Foo[]] $fooArr = @{ Bar = 'None' }, [pscustomobject] @{ Baz = 42 }
之后输出
$fooAr
将产生:

Bar  Baz
---  ---
None   0
      42
也就是说,从输入对象成功构建了两个
[Foo]
实例

有关PowerShell中强制转换和类型转换的详细信息,请参阅



[1] to PowerShell Core将允许从哈希表/自定义对象进行初始化,即使使用具有参数的构造函数,只要哈希表条目/自定义对象属性的输入集存在匹配的构造函数重载。

是否
[myclass]
有一个以一个字符串作为参数的构造函数吗?这太棒了。非常感谢您提供的所有信息。现在我知道发生了什么,我可以据此计划。我的实际实现并不总是有一个与输入对象匹配的公共属性。我基本上接受一个JSON对象数组,并使用构造函数为可读性和整合性重命名一些属性。但这无疑让我走上了正确的道路。很高兴听到这一点,@TimN_FL;我很高兴。
# Define a class.
# Not defining a constructor explicitly implicitly defines
# a public, parameter-less one.
class Foo {
  [string] $Bar
  [int]    $Baz
}

# Create an array of [Foo] instances via initialization by a
# hashtable and a custom object.
[Foo[]] $fooArr = @{ Bar = 'None' }, [pscustomobject] @{ Baz = 42 }