注意:我假设您的工作示例打算使用 [myclass]::new($_),而不是 [myclass[]]::new($_),即您在每次循环迭代中创建一个 single [myclass] 实例:@ 987654326@
与其尝试将初始化值数组传递给静态::new() 方法(即,传递给幕后的构造函数),cast 它:
[myclass[]]$Temp = $ClassData
注意[myclass[]] 是[myclass] 类型实例的数组,如果[myclass]::new($_) 与代表单个字符串的$_ 一起使用,那么上述转换应该会成功。 p>
基本上,PowerShell 将在幕后执行您的基于循环的解决方案显式执行的操作。
至于你尝试了什么:
[myclass[]]::new($ClassData) 不起作用,因为[array] (System.Array) 没有 构造函数 可以接受现有数组来初始化新数组;唯一的构造函数是接受数组的 size(长度,元素计数)的构造函数,您可以按如下方式验证:
PS> [object[]]::new
OverloadDefinitions
-------------------
System.Object[] new(int )
可选阅读:从哈希表/自定义对象转换:
强制转换非常灵活,例如比 C# 灵活得多。
即使输入类型不能直接转换为目标类型并且目标类型没有输入类型的单参数构造函数,如果 all PowerShell 仍然能够构造目标类型的实例 满足以下条件:
- 目标类型有一个无参数的公共构造函数。[1]
- 输入类型与目标类型或它们的子集具有相同的属性集。
- 所有重叠属性本身都是类型兼容的(属性属于同一类型,或者可以从输入属性类型转换为目标属性类型)。
这是一个从包含 hashtable 和 自定义对象的数组中初始化 自定义类 数组的示例(使用 PSv5+ class 定义) ([pscustomobject]) 每个都提供目标类型属性的子集。
# 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 中的强制转换和类型转换的详细信息,请参阅this answer。
[1] An approved future enhancement 到 PowerShell Core 将允许从哈希表/自定义对象进行初始化,即使使用具有参数的构造函数,只要输入集有匹配的构造函数重载哈希表条目/自定义对象属性。