class Molecule{
[Int]$carbon
[Int]$hydrogen
[Int]$oxygen
}
$items = [ordered]@{
water = [ordered]@{carbon = 0; hydrogen = 2; oxygen = 1}
methane = [ordered]@{carbon = 1; hydrogen = 4; oxygen = 0}
}
$EachKey1 = @() # Just for T-Shooting
$EachObj = @() # Just for T-Shooting
foreach ($key in $items.psbase.keys){
$EachKey1 += $key
$key = New-Object Molecule
$EachObj += $key
$key.carbon = $items.$key.carbon
$key.hydrogen = $items.$key.hydrogen
$key.oxygen = $items.$key.oxygen
}
""
$EachKey1 # Anticipated Values
$EachObj # Not getting values#########################输出低于#########################

请协助自动或通过迭代来实例化对象。
我无法实例化上述尝试过的对象--水和甲烷。
谢谢!
发布于 2022-04-04 04:32:20
目前还不完全清楚您的预期输出会是什么,但是,这一行中有一个明显的错误:
$key = New-Object Molecule正在迭代的项(哈希表键)将被Molecule对象的新实例替换,即执行属性赋值时:
$key.carbon = $items.$key.carbon
$key.hydrogen = $items.$key.hydrogen
$key.oxygen = $items.$key.oxygen但是,实际上是将$null分配给每个属性值,因为您的类属性被限制为[int] PowerShell将$null转换为的类型
[int] $null # => 0如果您想要一个Molecule对象数组,您可以这样做:
$EachObj = foreach ($key in $items.PSBase.Keys) {
[Molecule] $items[$key]
}PowerShell通过类型转换或类型转换将有序字典转换为类的实例。其结果如下:
PS /> $EachObj
carbon hydrogen oxygen
------ -------- ------
0 2 1
1 4 0
PS /> $EachObj[0] | Get-Member
TypeName: Molecule
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
carbon Property int carbon {get;set;}
hydrogen Property int hydrogen {get;set;}
oxygen Property int oxygen {get;set;}将类型转换到Molecule实例数组中也可以:
PS /> $EachObj = [Molecule[]] $items[$items.PSBase.Keys]
PS /> $EachObj.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Molecule[] System.Array后退一步,如果您的意图是要有一个带有类实例作为值的有序字典,您可以这样做:
$items = [ordered]@{
water = [Molecule]@{ carbon = 0; hydrogen = 2; oxygen = 1 }
methane = [Molecule]@{ carbon = 1; hydrogen = 4; oxygen = 0 }
}https://stackoverflow.com/questions/71731959
复制相似问题