欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

enum VersionType { SoftwareVersion = 1 HardwareVersion = 2 } [VersionType]::SoftwareVersion 为什么结果是SoftwareVersion 而不是 1 文心一言 chatgpt 有大用

enum VersionType {
    SoftwareVersion = 1
    HardwareVersion = 2
}
[VersionType]::SoftwareVersion

为什么结果 是 SoftwareVersion 而不是 1



在 PowerShell 中,当你通过枚举(enum)的名称来引用其成员时,默认行为是返回该成员的名称(字符串形式),而不是其整数值。这是 PowerShell 枚举工作的一种常见且预期的行为。

在你的例子中,VersionType 是一个枚举,它有两个成员:SoftwareVersion 和 HardwareVersion,分别被赋予了整数值 1 和 2。但是,当你通过 [VersionType]::SoftwareVersion 访问 SoftwareVersion 成员时,PowerShell 返回的是该成员的名称 "SoftwareVersion",而不是它的整数值 1

如果你想获取枚举成员的整数值,你需要显式地请求它。这可以通过几种方式完成,但最直接的方法是使用枚举成员的 value__ 属性(尽管这不是 PowerShell 官方推荐的做法,因为它依赖于 .NET Framework 的内部实现):

powershell复制代码

$value = [VersionType]::SoftwareVersion.value__

Write-Host $value  # 输出: 1

然而,更推荐的做法是定义一个方法来获取枚举成员的整数值,或者使用 PowerShell 的功能来根据枚举名称动态获取值。但请注意,PowerShell 原生不支持直接根据枚举名称动态获取其整数值的简洁语法(如 GetEnumName 方法用于从整数值获取名称,但没有直接的反向方法)。

如果你需要频繁地根据枚举名称获取其整数值,你可以编写一个简单的函数来辅助这一操作:

powershell复制代码

function GetEnumValue([System.Enum]$enumType, $enumName) {

$enumValues = [System.Enum]::GetValues($enumType)

foreach ($value in $enumValues) {

if ($value.ToString() -eq $enumName) {

return [int]$value  

}

}

throw "Enum value '$enumName' not found in enum type '$enumType'."  

}



$softwareVersionValue = GetEnumValue [VersionType] "SoftwareVersion"  

Write-Host $softwareVersionValue  # 输出: 1

这个函数遍历枚举的所有值,并返回与给定名称相匹配的整数值。如果找不到匹配项,则抛出异常。这种方法虽然需要编写额外的代码,但它更加清晰和灵活。



在 PowerShell 中使用枚举(enum)时,当你直接输出枚举的某个成员,如 [VersionType]::SoftwareVersion,它默认会显示该成员的名字而不是其基础数值。这是因为枚举类型的成员本质上是一个带有名称的常量,而这些名称通常比它们的基础值更有意义,便于理解和阅读。

然而,如果你想要获取或显示枚举成员的基础数值,你可以通过 .value__ 属性来访问。例如:

powershell
深色版本
[VersionType]::SoftwareVersion.value__

这将会输出 1,即 SoftwareVersion 成员对应的基础整数值。

枚举类型的设计初衷是为了提高代码的可读性和可维护性,因此在大多数情况下,直接使用枚举成员的名称是更为推荐的做法。但是,在需要处理数值比较或者序列化等场景时,获取基础数值就显得很有必要了。


普通分类: