【问题标题】:Strong typing dictionary contents强类型字典内容
【发布时间】:2021-06-16 14:41:47
【问题描述】:

作为从 PS2.0、函数和脚本快速实践到 PS5.0、类和编程最佳实践的大型 PowerShell 程序重构的一部分,我一直在到处使用强类型,并找到了一些地方问题。最新的是哈希表。 使用[Array] 和[Hashtable],您可以混合内容,这使得枚举该集合不可能强类型。对于数组,您可以选择[String[]] 或使用[System.Collections.Generic.List[String]] 移至通用列表。但字典似乎带来了问题。我找不到创建字典并将其值限制为特定类型的方法。像[System.Collections.Specialized.OrderedDictionary[Int32,Int32]] 这样的东西失败了。 那么,有没有办法通过索引、值或两者的强类型来制作字典和 OrderedDictionaries?如果没有办法,这是否被认为是一个必须克服的问题,或者不是问题,如果是,为什么它不是问题?

【问题讨论】:

  • “我一直在到处使用强类型” 为什么? PowerShell 专门设计用于放宽其他语言严格要求的一些东西——它主要是为管理员而不是开发人员提供的工具,因此更加宽容。从“monad”时代开始,我就一直在使用它,并且已经记不清我写过的脚本数量了,而且缺乏强类型很少(如果有的话)是个问题;你只需要知道它就是这样工作的。就个人而言,我认为你只是在为自己创造额外的工作而没有真正的收益。
  • @boxdog 我将 PowerShell 用于管理软件安装、自定义、mization、更新和卸载的实用程序。有很多内置功能使它适合这样的事情。但是程序是数千行代码,而不是小脚本或单行代码,因此转向更多“程序”最佳实践有助于可扩展性、首次亮相等。两全其美。

标签: powershell dictionary ordereddictionary strong-typing


【解决方案1】:

您可以创建泛型字典,但根据Create new System.Collections.Generic.Dictionary object fails in PowerShell,您必须使用反引号来转义泛型类型参数列表中的逗号:

例如

PS> $dict = new-object System.Collections.Generic.Dictionary[int`,string]

请注意,PowerShell 仍然会尽力强制类型,因此它只会在无法转换类型时抛出异常:

PS> $dict.Add("1", "aaa") # equivalent to $dict.Add(1, "aaa")

而且我不相信 有一个通用的 OrderedDictionary 开箱即用,这可能就是失败的原因:-)

PS> new-object System.Collections.Specialized.OrderedDictionary[Int32`,Int32]
New-Object: Cannot find type [System.Collections.Specialized.OrderedDictionary[Int32,Int32]]: verify that the assembly containing this type is loaded.

【讨论】:

  • 有趣。虽然您的 $dict = new-object System.Collections.Generic.Dictionary[int,string]` 有效,但我尝试了较新的构造函数方法 $dict = [System.Collections.Generic.Dictionary[int,string]]::new()`,但失败了。有点遗憾,因为我真的想与使用新命名法保持一致。而$dict = new-object System.Collections.Specialized.OrderedDictionary[string,string]` 也失败了,我猜是暗示Specialized.OrderedDictionary 不遵循同样的规则?
  • @Gordon,直接调用构造函数时,不需要转义逗号:$dict = [System.Collections.Generic.Dictionary[int,string]]::new()。适用于我的 PS5 和 PS7+。
  • 另外,在切线上,StackOverflow 的转义字符是什么,所以我可以在代码格式的字符串中得到一个反勾号,而不是结束它?
  • @Gordon 尝试反斜杠转义反引号:\`
  • @Gordon - OrderedDictionary 不是通用的,所以你不能指定类型参数 - 它基本上是“(对象,对象)” - 见docs.microsoft.com/en-us/dotnet/api/… - New-Object System.Collections.Specialized.OrderedDictionary
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2013-06-09
  • 2022-01-11
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多