डुप्लिकेट अनुमत विशेषताएँ कैसे बनाएँ


96

मैं एक विशेषता वर्ग से विरासत में मिली कस्टम विशेषता का उपयोग कर रहा हूँ। मैं इसे इस तरह उपयोग कर रहा हूं:

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

}

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

जवाबों:


184

AttributeUsageअपने विशेषता वर्ग पर एक स्टिक चिपकाएँ (हाँ, यह कौर है) और इसके लिए सेट AllowMultipleकरें true:

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

6
बस जिज्ञासु - एक "सील" वर्ग क्यों?
टॉमस अचान

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

3
क्यों सील किया गया? संक्षेप में: बनाता है विशेषता तेजी से देखने और कोई अन्य प्रभाव नहीं है।
नोएल विडमर

सिवाय इसके कि यह आपके कोड का पुन: उपयोग करने से किसी और को रोकता है। वर्थ नोटिंग कि DataAnnotations में सत्यापन विशेषताओं को सील नहीं किया गया है, जो बेहद उपयोगी है क्योंकि यह उनमें से विशेषज्ञता बनाने के लिए संभव बनाता है।
न्यूट्रिनो

जब भी आप उम्मीद न करें या विरासत में मिली अपनी कक्षाओं को डिज़ाइन न करें, तो @Neutrino को सील किया जाना चाहिए। इसके अलावा, जब वंश बग के स्रोत बन सकते हैं: थ्रेड-सुरक्षित कार्यान्वयन।
फ्रांसिस्को नेटो

20

एट्रिब्यूटेजएट्यूट;

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

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


13

एंटन का समाधान सही है, लेकिन एक और गोच है

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


लेकिन यह इसके माध्यम से काम करता है: var customAtt = propertyInfo.GetCustomAttributes <MyCustomAttribute> ();
oo_dev

8

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

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

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

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

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

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

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


3

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

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

या

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

फिर अपनी विशेषता को कॉन्फ़िगर करने के लिए मानों को पार्स करें।

इस उदाहरण के लिए www.codeplex.com/aspnet पर ASP.NET MVC स्रोत कोड में AuthorizeAttribute की जाँच करें ।


3
यह भी संभव है कि MyCustomAttributeकंस्ट्रक्टर को संशोधक के साथ या बिना, स्ट्रिंग्स की एक सरणी लेनी चाहिए । तब इसे सिंटैक्स (साथ ) के साथ लागू किया जा सकता था । string[]params[MyCustom("CONTROL", "ALT", "SHIFT", "D")]params
जेपी स्टिग नील्सन

2

एट्रीब्यूट्स जोड़ने के बाद, सुनिश्चित करें कि आप इस संपत्ति को अपने एट्रीब्यूट क्लास में जोड़ सकते हैं

public override object TypeId
{
  get
  {
    return this;
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.