我正在尝试编写2种扩展方法来处理Enum类型。一个使用description属性为枚举选项提供更好的解释,另一个用于列出枚举选项及其描述以在选择列表或某种集合中使用。
到目前为止,您可以阅读我的代码:
<Extension()> _
Public Function ToDescriptionString(ByVal en As System.Enum) As String
Dim type As Type = en.GetType
Dim entries() As String = en.ToString().Split(","c)
Dim description(entries.Length) As String
For i = 0 To entries.Length - 1
Dim fieldInfo = type.GetField(entries(i).Trim())
Dim attributes() = DirectCast(fieldInfo.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())
description(i) = If(attributes.Length > 0, attributes(0).Description, entries(i).Trim())
Next
Return String.Join(", ", description)
End Function
<Extension()> _
Public Function ToListFirstTry(ByVal en As System.Enum) As IEnumerable
Dim type As Type = en.GetType
Dim items = From item In System.Enum.GetValues(type) _
Select New With {.Value = item, .Text = item.ToDescriptionString}
Return items
End Function
<Extension()> _
Public Function ToListSecondTry(ByVal en As System.Enum) As IEnumerable
Dim list As New Dictionary(Of Integer, String)
Dim enumValues As Array = System.Enum.GetValues(en.GetType)
For Each value In enumValues
list.Add(value, value.ToDescriptionString)
Next
Return list
End Function
所以我的问题是两种扩展方法都不能很好地协同工作。将枚举选项转换为不可数的方法不能使用扩展方法来获取描述。
我找到了所有类型的例子来做其中一个但从未相互结合。我究竟做错了什么?我还不熟悉这些新的.NET 3.5内容。
答案 0 :(得分:2)
问题是Enum.GetValues
只返回弱类型的Array
。
试试这个:
Public Function ToListFirstTry(ByVal en As System.Enum) As IEnumerable
Dim type As Type = en.GetType
Dim items = From item In System.Enum.GetValues(type).Cast(Of Enum)() _
Select New With {.Value = item, .Text = item.ToDescriptionString}
Return items
End Function
(看起来VB查询中明确键入的范围变量与C#中的含义不同。)