2011-02-23 18 views
28

मेरे पास एक enum है जहां प्रत्येक सदस्य के पास एक कस्टम विशेषता लागू होती है। मैं प्रत्येक विशेषता में संग्रहीत मूल्य कैसे प्राप्त कर सकता हूं?enums के लिए कस्टम विशेषता मान कैसे प्राप्त करें?

var attributes = typeof (EffectType).GetCustomAttributes (false); 
foreach (object attribute in attributes) 
{ 
    GPUShaderAttribute attr = (GPUShaderAttribute) attribute; 
    if (attr != null) 
     return attr.GPUShader; 
} 
return 0; 

एक और मुद्दा है, अगर यह नहीं मिला है, क्या मैं वापसी करना चाहिए:

अभी मैं यह कर? 0 इम्प्रसिटी किसी भी enum के लिए परिवर्तनीय है, है ना? यही कारण है कि मैंने इसे वापस कर दिया।

उल्लेख करने के लिए भूल गए, उपरोक्त कोड प्रत्येक enum सदस्य के लिए 0 देता है।

+1

की [क्या AttributeTarget मैं enum सदस्यों के लिए इस्तेमाल करना चाहिए?] (Http संभव डुप्लिकेट: // stackoverflow .com/प्रश्न/5032774/what-attributetarget-should-i-use-for-enum-members) –

+2

नहीं यह अलग है। यहां मैं प्रतिबिंब का उपयोग करके एक enum सदस्य पर सेट कस्टम विशेषताओं को प्राप्त करने की कोशिश कर रहा हूं। –

+1

संभावित डुप्लिकेट [एनम के मूल्य के गुण प्राप्त करना] (http://stackoverflow.com/questions/1799370/getting-attributes-of-enums-value) –

उत्तर

26

यह आप आप प्रतिबिंब का उपयोग करने के रूप में करने के लिए कोशिश कर रहे हैं कि क्या करना है एक सा गन्दा है:

public GPUShaderAttribute GetGPUShader(EffectType effectType) 
{ 
    MemberInfo memberInfo = typeof(EffectType).GetMember(effectType.ToString()) 
               .FirstOrDefault(); 

    if (memberInfo != null) 
    { 
     GPUShaderAttribute attribute = (GPUShaderAttribute) 
        memberInfo.GetCustomAttributes(typeof(GPUShaderAttribute), false) 
           .FirstOrDefault(); 
     return attribute; 
    } 

    return null; 
} 

यह GPUShaderAttribute कि EffectType की enum मूल्य पर चिह्नित एक के लिए प्रासंगिक है का एक उदाहरण वापस आ जाएगी। आप EffectType enum के एक विशिष्ट मूल्य पर कॉल करनी होगी:

GPUShaderAttribute attribute = GetGPUShader(EffectType.MyEffect); 

एक बार जब आप विशेषता का उदाहरण है, तो आप विशिष्ट मानों इसे से बाहर है कि व्यक्ति enum मूल्यों पर चिह्नित कर रहे हैं मिल सकता है।

class DayAttribute : Attribute 
{ 
    public string Name { get; private set; } 

    public DayAttribute(string name) 
    { 
     this.Name = name; 
    } 
} 

Enum:

enum Days 
{ 
    [Day("Saturday")] 
    Sat, 
    [Day("Sunday")] 
    Sun, 
    [Day("Monday")] 
    Mon, 
    [Day("Tuesday")] 
    Tue, 
    [Day("Wednesday")] 
    Wed, 
    [Day("Thursday")] 
    Thu, 
    [Day("Friday")] 
    Fri 
} 

जेनेरिक विधि

public static T GetAttribute<T>(Enum enumValue) where T: Attribute 
{ 
    T attribute; 

    MemberInfo memberInfo = enumValue.GetType().GetMember(enumValue.ToString()) 
            .FirstOrDefault(); 

    if (memberInfo != null) 
    { 
     attribute = (T) memberInfo.GetCustomAttributes(typeof (T), false).FirstOrDefault(); 
     return attribute; 
    } 
    return null; 
} 
+0

धन्यवाद आदमी, यह काम करता है। मुझे नहीं पता था कि यह जटिल होगा। लेकिन यह सबसे आसान तरीका है, है ना? यह भी आपको पता है कि मेरा संस्करण क्यों काम नहीं करता है। मैंने सोचा था कि enum.getCustomAttributes का उपयोग करके enums को इंस्टाल नहीं किया जा सकता है। –

+1

@ जोन: जहां तक ​​मुझे पता है यह सबसे आसान तरीका है। आपकी विधि काम नहीं करती क्योंकि आप प्रकार के मानों के बजाय enum प्रकार पर परिभाषित विशेषताओं को प्राप्त कर रहे थे। – adrianbanks

+0

धन्यवाद एड्रियन, जो अब समझ में आता है। –

2

मैं इस प्रयास नहीं किया है, लेकिन यह इस ब्लॉग पोस्ट की तरह दिखता है का वर्णन करता है कि आप क्या देख रहे हैं: Enumeration attribute help

22

वहाँ जेनरिक के साथ ऐसा करना एक और तरीका है :

 public static TAttribute GetAttribute<TAttribute>(this Enum value) 
     where TAttribute : Attribute 
    { 
     var enumType = value.GetType(); 
     var name = Enum.GetName(enumType, value); 
     return enumType.GetField(name).GetCustomAttributes(false).OfType<TAttribute>().SingleOrDefault(); 
    } 

आह्वान:

 static void Main(string[] args) 
    { 
     var day = Days.Mon; 
     Console.WriteLine(day.GetAttribute<DayAttribute>().Name); 
     Console.ReadLine(); 
    } 

परिणाम:

सोमवार

+1

मुझे यह पसंद है, लेकिन यह एक ही विशेषता के कई उदाहरण होने की संभावना को ध्यान में रखता है। मैंने आपके पास जो लिया था उसे लिया और इसे टी के बजाय टी [] में संशोधित किया, फिर GetCustomAttributes पर FirstOrDefault() को हटा दिया। –

15

एक सामान्य विधि

गुण उपयोग करके देखें:

+0

इच्छा है कि मैं इस जवाब को 100 बार बढ़ा सकता हूं !! उत्तम सामग्री :-) – Gericke

संबंधित मुद्दे