2015-09-07 160 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