从Value获取VB.net Enum描述

时间:2013-09-19 07:21:49

标签: vb.net enums

如何从其值中获取Enum描述?

我可以使用以下名称从名称中获取描述:

Public Shared Function GetEnumDescription(ByVal EnumConstant As [Enum]) As String
    Dim fi As FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString())
    Dim attr() As DescriptionAttribute = _ 
                  DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute), _
                  False), DescriptionAttribute())

    If attr.Length > 0 Then
        Return attr(0).Description
    Else
        Return EnumConstant.ToString()
    End If
End Function 

但我无法弄清楚如何将变量名称传递给此函数。我尝试过像

这样的事情
GetEnumDescription([Enum].GetName(GetType(myEnum), 2)))

但我尝试过的一切都没有。

2 个答案:

答案 0 :(得分:16)

如果你有一个枚举类型的变量,它只是

GetEnumDescription(myEnum)

最小的工作示例:

Enum TestEnum
    <Description("Description of Value1")>
    Value1
End Enum

Public Sub Main()
    Dim myEnum As TestEnum = TestEnum.Value1
    Console.WriteLine(GetEnumDescription(myEnum)) ' prints "Description of Value1"
    Console.ReadLine()
End Sub

如果您有Integer变量,则需要先将其转换为枚举类型(CType也可以):

GetEnumDescription(DirectCast(myEnumValue, TestEnum))

工作示例:

Enum TestEnum
    <Description("Description of Value1")>
    Value1 = 1
End Enum

Public Sub Main()
    Console.WriteLine(GetEnumDescription(DirectCast(1, TestEnum)))
    Console.ReadLine()
End Sub

您混淆的原因似乎是一个误解:您的方法不会将枚举的“名称”作为参数,它需要Enum作为参数。这是不同的,这也是您尝试使用GetName失败的原因。

答案 1 :(得分:3)

这是将Enum的描述作为扩展的另一种解决方案。

Imports System.ComponentModel
Imports System.Runtime.CompilerServices

<Extension()> Public Function GetEnumDescription(ByVal EnumConstant As [Enum]) As String
    Dim attr() As DescriptionAttribute = DirectCast(EnumConstant.GetType().GetField(EnumConstant.ToString()).GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())
    Return If(attr.Length > 0, attr(0).Description, EnumConstant.ToString)
End Function

以前帖子的使用示例:

Enum Example
    <Description("Value1 description.")> Value1 = 1
    <Description("Value2 description.")> Value2 = 2
End Enum

Sub Main()
    Console.WriteLine(DirectCast(2, Example).GetEnumDescription())
    Console.ReadLine()
End Sub