首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动或使用迭代实例化对象

自动或使用迭代实例化对象
EN

Stack Overflow用户
提问于 2022-04-04 04:14:43
回答 1查看 50关注 0票数 0
代码语言:javascript
复制
    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

#########################输出低于#########################

请协助自动或通过迭代来实例化对象。

我无法实例化上述尝试过的对象--水和甲烷。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 04:32:20

目前还不完全清楚您的预期输出会是什么,但是,这一行中有一个明显的错误:

代码语言:javascript
复制
$key = New-Object Molecule

正在迭代的项(哈希表)将被Molecule对象的新实例替换,即执行属性赋值时:

代码语言:javascript
复制
$key.carbon   = $items.$key.carbon
$key.hydrogen = $items.$key.hydrogen
$key.oxygen   = $items.$key.oxygen

但是,实际上是将$null分配给每个属性值,因为您的类属性被限制为[int] PowerShell将$null转换为的类型

代码语言:javascript
复制
[int] $null # => 0

如果您想要一个Molecule对象数组,您可以这样做:

代码语言:javascript
复制
$EachObj = foreach ($key in $items.PSBase.Keys) {
    [Molecule] $items[$key]
}

PowerShell通过类型转换或类型转换将有序字典转换为类的实例。其结果如下:

代码语言:javascript
复制
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实例数组中也可以:

代码语言:javascript
复制
PS /> $EachObj = [Molecule[]] $items[$items.PSBase.Keys]

PS /> $EachObj.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Molecule[]                               System.Array

后退一步,如果您的意图是要有一个带有类实例作为值的有序字典,您可以这样做:

代码语言:javascript
复制
$items = [ordered]@{
    water   = [Molecule]@{ carbon = 0; hydrogen = 2; oxygen = 1 }
    methane = [Molecule]@{ carbon = 1; hydrogen = 4; oxygen = 0 }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71731959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档