N.T*_*T.C 8 .net vb.net string enums
我有Enum如下
Public Enum FailureMessages
<Description("Failed by bending")>
FailedCode1 = 0
<Description("Failed by shear force")>
FailedCode2 = 1
End Enum
Run Code Online (Sandbox Code Playgroud)
每个枚举都有自己的描述.例如,FailedCode1有自己的描述为"弯曲失败".
下面是我的主要Sub(),我想将一个变量(类型字符串)分配给相应的枚举.
Sub Main()
Dim a As Integer = FailureMessages.FailedCode1
Dim b As String 'I would b = Conresponding description of variable a above
'that means: I would b will be "Failed by bending". How could I do that in .NET ?
End Sub
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我,我怎么能在VB.NET中做到这一点
你需要用来Reflection检索Description.由于这些是用户添加的,因此可能缺少一个或多个,我喜欢让它返回Name如果Attribute缺少.
Imports System.Reflection
Imports System.ComponentModel
Public Shared Function GetEnumDescription(e As [Enum]) As String
Dim t As Type = e.GetType()
Dim attr = CType(t.
GetField([Enum].GetName(t, e)).
GetCustomAttribute(GetType(DescriptionAttribute)),
DescriptionAttribute)
If attr IsNot Nothing Then
Return attr.Description
Else
Return e.ToString
End If
End Function
Run Code Online (Sandbox Code Playgroud)
用法:
Dim var As FailureMessages = FailureMessages.FailedCode1
Dim txt As String = GetDescription(var)
Run Code Online (Sandbox Code Playgroud)
您可以创建一个版本来获取所有描述Enum:
Friend Shared Function GetEnumDescriptions(Of EType)() As String()
Dim n As Integer = 0
' get values to poll
Dim enumValues As Array = [Enum].GetValues(GetType(EType))
' storage for the result
Dim Descr(enumValues.Length - 1) As String
' get description or text for each value
For Each value As [Enum] In enumValues
Descr(n) = GetEnumDescription(value)
n += 1
Next
Return Descr
End Function
Run Code Online (Sandbox Code Playgroud)
用法:
Dim descr = Utils.GetDescriptions(Of FailureMessages)()
ComboBox1.Items.AddRange(descr)
Run Code Online (Sandbox Code Playgroud)
Of T使它更容易使用.传递类型将是:
Shared Function GetEnumDescriptions(e As Type) As String()
' usage:
Dim items = Utils.GetEnumDescriptions(GetType(FailureMessages))
Run Code Online (Sandbox Code Playgroud)
请注意,使用名称填充组合意味着您需要解析结果以获取值.相反,我发现将所有名称和值放在List(Of NameValuePairs)一起以便将它们保持在一起更好/更容易.
您可以将控件绑定到列表并用于DisplayMember向用户显示名称,而代码用于ValueMember获取实际键入的值.