2009-02-16 17 views
69

मैं एक विशेषता वर्ग से विरासत में प्राप्त एक कस्टम विशेषता का उपयोग कर रहा हूं। मैं इसे इस तरह उपयोग कर रहा हूं:डुप्लिकेट अनुमत गुण कैसे बनाएं

[MyCustomAttribute("CONTROL")] 
    [MyCustomAttribute("ALT")] 
    [MyCustomAttribute("SHIFT")] 
    [MyCustomAttribute("D")] 
    public void setColor() 
{ 

} 

लेकिन "डुप्लिकेट" MyCustomAttribute 'विशेषता "त्रुटि दिखाई गई है।
मैं डुप्लिकेट अनुमत विशेषता कैसे बना सकता हूं?

उत्तर

132

स्टिक अपने गुण वर्ग पर एक AttributeUsage विशेषता (हां, कि कौर है) और सेट AllowMultipletrue रहे हैं:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public sealed class MyCustomAttribute: Attribute 
+5

बस उत्सुक - क्यों एक "मुहरबंद" वर्ग? –

+15

माइक्रोसॉफ्ट जब भी संभव हो सीलिंग विशेषता वर्गों की सिफारिश करता है: http://msdn.microsoft.com/en-us/library/2ab31zeh.aspx –

+1

क्यों मुहरबंद? संक्षेप में: गुण लुकअप को तेज़ी से बनाता है और इसका कोई अन्य प्रभाव नहीं पड़ता है। –

16

AttributeUsageAttribute ;-p

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public class MyAttribute : Attribute 
{} 

नोट तथापि, यह है कि आप कर रहे हैं ComponentModel (TypeDescriptor) का उपयोग करके, यह केवल प्रति सदस्य एक विशेषता उदाहरण (प्रति विशेषता प्रकार) का समर्थन करता है; कच्चे प्रतिबिंब किसी भी संख्या का समर्थन करता है ...

3

एक विकल्प के रूप में, अनुक्रम की अनुमति देने के लिए अपनी विशेषता को फिर से डिजाइन करने के बारे में सोचें।

[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")] 

या

[MyCustomAttribute("CONTROL-ALT-SHIFT-D")] 

फिर अपने गुण कॉन्फ़िगर करने के लिए मूल्यों को पार्स।

इस उदाहरण के लिए www.codeplex.com/aspnet पर एएसपी.नेट एमवीसी स्रोत कोड में AuthorizeAttribute देखें।

+1

यह भी संभव है कि 'MyCustomAttribute' कन्स्ट्रक्टर' पैरा 'मोडिफ़ायर के साथ या उसके बिना' स्ट्रिंग [] 'तारों का एक * सरणी * ले ले। फिर इसे वाक्यविन्यास '[MyCustom ("CONTROL", "ALT", "SHIFT", "D")]' ('params' के साथ) के साथ लागू किया जा सकता है। –

11

Anton's solution सही है, लेकिन another gotcha है।

संक्षेप में, जब तक कि आपका कस्टम अटूटबीट TypeId को ओवरराइड नहीं करता है, तब PropertyDescriptor.GetCustomAttributes() के माध्यम से इसे एक्सेस करने से केवल आपकी विशेषता का एक ही उदाहरण वापस आ जाएगा।

1

आप AttributeUsage जोड़ने के बाद, सुनिश्चित करें कि आप अपने गुण वर्ग

public override object TypeId 
{ 
    get 
    { 
    return this; 
    } 
} 
2

डिफ़ॉल्ट रूप से करने के लिए इस संपत्ति जोड़ने बनाने, Attribute रों एक भी क्षेत्र/संपत्ति/आदि के लिए केवल एक बार लागू किया जा रहा करने के लिए सीमित कर रहे हैं। आप definition of the Attribute class on MSDN से देख सकते हैं:

[AttributeUsageAttribute(..., AllowMultiple = false)] 
public abstract class Attribute : _Attribute 

इसलिए, के रूप में दूसरों का उल्लेख किया है, सभी उपवर्गों उसी तरह से सीमित हैं, और आप एक ही विशेषता के कई उदाहरण की आवश्यकता होती है चाहिए, आप की जरूरत स्पष्ट रूप से true को AllowMultiple स्थापित करने के लिए :

[AttributeUsage(..., AllowMultiple = true)] 
public class MyCustomAttribute : Attribute 

विशेषताओं कि कई उपयोगों के लिए अनुमति देते हैं पर, you should also override the TypeId property सुनिश्चित करना है कि गुण की उम्मीद के रूप में ऐसी PropertyDescriptor.Attributes काम के रूप में। यह करने के लिए सबसे आसान तरीका है कि संपत्ति विशेषता उदाहरण ही वापस जाने के लिए लागू करने के लिए है:

[AttributeUsage(..., AllowMultiple = true)] 
public class MyCustomAttribute : Attribute 
{ 
    public override object TypeId 
    { 
     get 
     { 
      return this; 
     } 
    } 
} 

(इस उत्तर पोस्ट कर रहा है दूसरों गलत हैं, लेकिन क्योंकि यह एक अधिक व्यापक/विहित जवाब है क्योंकि नहीं।)

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