自动或迭代实例化对象
Instantiate Objects Automatically or with Iteration
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
######################### 下面输出 ################ #######
请协助自动或通过迭代实例化对象。
我无法像上面那样实例化对象水和甲烷。
谢谢!
不完全清楚您的预期输出是什么,但是,明显的错误在这一行:
$key = New-Object Molecule
您正在迭代的项目(散列 table Key)正在被 Molecule
对象的新实例替换,当做 属性 作业:
$key.carbon = $items.$key.carbon
$key.hydrogen = $items.$key.hydrogen
$key.oxygen = $items.$key.oxygen
您实际上是将 $null
分配给每个 属性 值,但是,由于您的 class 属性 被限制为类型 [int]
PowerShell 正在将 $null
转换为 0:
[int] $null # => 0
如果你想要一个 Molecule
对象的数组,你可以简单地这样做:
$EachObj = foreach ($key in $items.PSBase.Keys) {
[Molecule] $items[$key]
}
PowerShell 通过类型转换 或type conversion 将有序字典 转换为class 的实例。结果如下:
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
退一步说,如果您的意图是将 class 的实例作为值来创建一个有序字典,您可以这样做:
$items = [ordered]@{
water = [Molecule]@{ carbon = 0; hydrogen = 2; oxygen = 1 }
methane = [Molecule]@{ carbon = 1; hydrogen = 4; oxygen = 0 }
}
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
######################### 下面输出 ################ #######
请协助自动或通过迭代实例化对象。
我无法像上面那样实例化对象水和甲烷。
谢谢!
不完全清楚您的预期输出是什么,但是,明显的错误在这一行:
$key = New-Object Molecule
您正在迭代的项目(散列 table Key)正在被 Molecule
对象的新实例替换,当做 属性 作业:
$key.carbon = $items.$key.carbon
$key.hydrogen = $items.$key.hydrogen
$key.oxygen = $items.$key.oxygen
您实际上是将 $null
分配给每个 属性 值,但是,由于您的 class 属性 被限制为类型 [int]
PowerShell 正在将 $null
转换为 0:
[int] $null # => 0
如果你想要一个 Molecule
对象的数组,你可以简单地这样做:
$EachObj = foreach ($key in $items.PSBase.Keys) {
[Molecule] $items[$key]
}
PowerShell 通过类型转换 或type conversion 将有序字典 转换为class 的实例。结果如下:
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
退一步说,如果您的意图是将 class 的实例作为值来创建一个有序字典,您可以这样做:
$items = [ordered]@{
water = [Molecule]@{ carbon = 0; hydrogen = 2; oxygen = 1 }
methane = [Molecule]@{ carbon = 1; hydrogen = 4; oxygen = 0 }
}