Подтвердить что ты не робот

Получить VB.net Enum Описание из значения

Как я могу получить описание 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)))

но ничего, что я пробовал, является правильным.

4b9b3361

Ответ 1

Если у вас есть переменная вашего типа перечисления, просто

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 не удалось.

Ответ 2

Здесь другое решение, чтобы получить описание 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