强类型字典内容

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

以上是关于强类型字典内容的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 强类型视图与否?

JSONObject能不能强转成String类型?

java中list强转为map类型

MVC 电影教程和强类型视图

强类型数据集作为水晶报表的数据源

Pyhon day6