首页 > 解决方案 > 为什么某些 Powershell 类型名称中需要加号运算符?

问题描述

为什么在 Powershell 中,System.DayOfWeek枚举可以引用 like [System.DayOfWeek],而System.Environment.SpecialFolder枚举必须引用 like [System.Environment+SpecialFolder](注意加号)?

我的猜测是因为 SpecialFolder 是静态 Environment 类的一部分,而 DayOfWeek 直接位于 System 命名空间中,但我无法找到有关此的任何信息。通常静态成员会使用“静态成员运算符”,但这在这种情况下不起作用,除了神秘的加号之外我也没有尝试其他任何东西......

[System.DayOfWeek] # returns enum type
[enum]::GetValues([System.DayOfWeek]) # returns enum values
[enum]::GetValues([System.Environment.SpecialFolder]) # exception: unable to find type
[enum]::GetValues([System.Environment]::SpecialFolder) # exception: value cannot be null
[enum]::GetValues([System.Environment+SpecialFolder]) # returns enum values

System.Environment.SpecialFolder 绝对是一种类型,在 C# 中,两个枚举的工作方式相同:

Enum.GetValues(typeof(System.Environment.SpecialFolder)) // works fine
Enum.GetValues(typeof(System.DayOfWeek)) // also works

我真的很想了解为什么 Powershell 有区别以及这种行为背后的原因。有谁知道为什么会这样?

标签: powershellenums

解决方案


System.Environment.SpecialFolder绝对是一种类型

SpecialFolder嵌套在typeEnvironment的Type位于命名空间 System中:

  • C#引用该类型作为引用段落中的完整类型名称;也就是说,它 .不仅用于将命名空间与包含类型的名称分开,用于将后者与其嵌套类型的名称分开。

  • 相比之下,PowerShell 使用 .NET 反射方法,Type.GetType()来在运行时获取对该类型的引用:

    • 该方法使用与语言无关的符号来标识类型,如文档主题指定完全限定的类型名称中所述。PetSerAl 致敬

    • 在该表示法中,它+用于将嵌套类型与其包含类型分开(不是.,如 C# 中的)。

即,PowerShell类型文字( [...]),例如:

[System.Environment+SpecialFolder]

实际上与获取[],之间的内容相同System.Environment+SpecialFolder,并将其作为字符串参数传递给Type.GetType,即(以 PowerShell 语法表示):

[Type]::GetType('System.Environment+SpecialFolder')

请注意, PowerShell 为.NET 的与语言无关的类型表示法提供了方便的扩展(简化) ,特别是能够使用 PowerShell 的类型加速器(例如[regex]for [System.Text.RegularExpressions.Regex]),从命名空间中省略System.前缀的能力(例如,[Collections.Generic.List`1[string]]代替[System.Collections.Generic.List`1[string]]),并且不必在`1传递类型参数列表时指定通用参数(例如)(例如[Collections.Generic.List[string]] ,而不是[Collections.Generic.List`1[string]] - 请参阅此答案)以获取更多信息。


推荐阅读