【问题标题】:Powershell Collection Class ConstructorPowershell 集合类构造函数
【发布时间】:2018-10-12 08:49:31
【问题描述】:

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

$Temp = [myclass[]]::new(1)

这种语法似乎创建了某种通用列表,我可以在其中指定列表的大小。我有什么办法可以为此修改构造函数吗?理想情况下,我想做以下事情:

[string[]]$ClassData = @('test1','test2','test3')
[myclass[]]$Temp = [myclass[]]::new($ClassData)

这将为 $ClassData 中的每个项目调用 myclass 的构造函数。不幸的是,这不是它目前的工作方式,我一直在使用以下方法解决这种情况:

[string[]]$ClassData = @('test1','test2','test3')
[myclass[]]$Temp = @($ClassData | [myclass[]]::new($_))

任何关于如何完成所有这些工作的帮助或解释将不胜感激

【问题讨论】:

  • [myclass] 是否有一个将一个字符串作为参数的构造函数?

标签: powershell class constructor initialization


【解决方案1】:

注意:我假设您的工作示例打算使用 [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 将允许从哈希表/自定义对象进行初始化,即使使用具有参数的构造函数,只要输入集有匹配的构造函数重载哈希表条目/自定义对象属性。

【讨论】:

  • 这太棒了。非常感谢您提供的所有信息。现在我知道发生了什么,我可以相应地计划。我的实际实现并不总是具有与输入对象匹配的公共属性。我基本上采用 JSON 对象数组并使用构造函数重命名一些属性以提高可读性和整合性。但这绝对让我走上了正确的道路。
  • 很高兴听到这个消息,@TimN_FL;我的荣幸。
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 2020-09-13
  • 2020-04-29
  • 2016-10-14
  • 2020-08-01
  • 2017-01-21
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多