强类型字典内容
Posted
技术标签:
【中文标题】强类型字典内容【英文标题】: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、更新和卸载的实用程序。有很多内置功能使它适合这样的事情。但是程序是数千行代码,而不是小脚本或单行代码,因此转向更多“程序”最佳实践有助于可扩展性、首次亮相等。两全其美。 【参考方案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+。
另外,在切线上,*** 的转义字符是什么,所以我可以在代码格式的字符串中得到一个反勾号,而不是结束它?
@Gordon 尝试反斜杠转义反引号:\`
@Gordon - OrderedDictionary 不是通用的,所以你不能指定类型参数 - 它基本上是“(对象,对象)” - 见docs.microsoft.com/en-us/dotnet/api/… - New-Object System.Collections.Specialized.OrderedDictionary
以上是关于强类型字典内容的主要内容,如果未能解决你的问题,请参考以下文章