2015-09-07 158 views
2

我有这样的枚举:Vb.net自定义属性来枚举

<Flags()> 
    Public Enum FilterEnum As Integer 

    Green= 0 
    Blue = 1 
    Red = 2 
    Yellow = 4 

    End Enum 

我想给“绿色”和“黄色”某种属性的,所以当我得到这样的枚举:

Dim enumItems = [Enum].GetValues(myEnum) 

我会得到只有那些谁拥有属性,像这样的枚举值:

Dim enumItems = [Enum].GetValues(myEnum).where(function(o) o.myAttribute) 
+0

'[枚举] .GetValues()'工作在一个类型,所以它应该是'[枚举。 GetValues(GetType(FilterEnum))'否则它就像你可能想要的那种声音'.HasFlag' – Plutonix

回答

2

您可以创建这样一个自定义属性:

<AttributeUsage(AttributeTargets.Field)> 
Public Class SomeAttribute 
    Inherits System.Attribute 
    Public Property SomeValue As String 
End Class 

然后创建您的枚举,并与您的属性装饰领域:

Public Enum MyEnum 
    <Some(SomeValue:="Good One")> 
    Member1 = 1 
    <Some(SomeValue:="Bad One")> 
    Member2 = 2 
    <Some(SomeValue:="Good One")> 
    Member3 = 3 
End Enum 

并使用此查询,得到你想要的,考试PLE “好一个” S

'Indented to be more readable step by step 
Dim result As List(Of MyEnum) = _ 
    GetType(MyEnum).GetFields() _ 
        .Where(Function(field) _ 
          field.GetCustomAttributes(True) _ 
           .Cast(Of SomeAttribute) _ 
           .Any(Function(attribute) attribute.SomeValue = "Good One")) _ 
        .Select(Function(filtered) _ 
          CType(filtered.GetValue(Nothing), MyEnum)) _ 
        .ToList() 

而结果将是:

enter image description here

+0

可能当我回答这个问题时,我不知道我可以投票回答问题:) –

1

也许你可以使用System.ComponentModel.Description

<Flags()> 
Public Enum FilterEnum As Integer 
    <System.ComponentModel.Description("value_1")>_ 
    Green= 0 
    <System.ComponentModel.Description("value_2")>_ 
    Blue = 1 
    <System.ComponentModel.Description("value_3")>_ 
    Red = 2 
    <System.ComponentModel.Description("value_4")>_ 
    Yellow = 4 
End Enum 

,然后检查他们这样Get Enum from Description attribute