2011-10-31 11 views
5

मैंने एक ऐसा गुण बनाया है जो इसके कन्स्ट्रक्टर में एक (पैरा) सरणी स्वीकार करता है।सीएलएस अनुपालन विशेषताओं और सरणी पैरामीटर

internal class MyTestAttribute : Attribute 
{ 
    public MyTestAttribute (params Options[] options) 
    { 
     .... 
    } 
} 

Option यहाँ एक enum (मूल्यों के बहुत सारे के साथ), तो एक नमूना कॉल साइट हो जाएगा

[MyTest(Option.One, Option.Three)] 
internal void SomeMethod(int param1, long param2) 
{ 
    .... 
} 

सब कुछ अब तक विलक्षण है, है और सेटअप में काम करता है, लेकिन मैं एक प्राप्त कर रहा हूँ "विशेषता तर्क के रूप में Arrays सीएलएस-अनुरूप" प्रत्येक कॉल-साइट पर चेतावनी नहीं है। अब, मुझे यह मानना ​​है कि मुझे इस असेंबली को अन्य लोगों से कहीं भी उपयोग करने की आवश्यकता नहीं है, न ही मैं चेतावनियों के रूप में चेतावनी करता हूं, लेकिन सैकड़ों चेतावनियां परेशान हो रही हैं।

स्पष्ट समाधान सीएलएस-अनुपालन को बंद करना है, लेकिन फिलहाल मैं ऐसा नहीं कर सकता।

क्या विशेषता के निर्माण के लिए कोई और दृष्टिकोण है जो अभी भी वही काम करेगा, लेकिन चेतावनियों से छुटकारा पाएं?

उत्तर

11

दो विकल्प:

1: आप कुछ भार के बजाय जोड़ सकते हैं:

private MyTestAttribute(Option[] options) {...} 
public MyTestAttribute(Option option0) 
      : this(new[] {option0}) {} 
public MyTestAttribute(Option option0, Option option1) 
      : this(new[] {option0, option1}) {} 
public MyTestAttribute(Option option0, Option option1, Option option2) 
      : this(new[] {option0, option1, option2}) {} 
// add a few more, without going crazy 

2: अगर Options एक enum, एक [Flags] enum के रूप में enum चिह्नित करें, और फोन करने वाले उन्हें गठबंधन है:

[MyTest(Option.One | Option.Two)] 

साथ:

[Flags] 
public enum Option { 
    None = 0, 
    One = 1, 
    Two = 2, 
    Three = 4, 
    Four = 8, 
    ... 
} 
+0

Arg, मुझे हराया! लेकिन सीएलएस एक आंतरिक विशेषता वर्ग पर क्यों शिकायत कर रहा है? – leppie

+0

हां, 'विकल्प' एक enum है, और कॉल साइट अधिकतर तीन या चार विकल्पों में उपयोग करेगी, इसलिए यह एक अच्छा समाधान है। टीएनएक्स, मुझे लगा कि मैं कुछ स्पष्ट दिख रहा था :) – SWeko

+0

@leppie, यह विशेषता की परिभाषा पर शिकायत नहीं कर रहा है (यह सार्वजनिक है अगर यह सार्वजनिक है), यह सार्वजनिक कॉल साइटों पर शिकायत कर रहा है। – SWeko

4

यह

वास्तव में क्या कहते हैं, "विशेषता तर्कों के रूप सरणी सीएलएस अनुरूप नहीं है।"

केवल वैकल्पिक हल स्पष्ट मानकों, जैसे बनाने के लिए है:

internal class MyTestAttribute : Attribute 
{ 
    public MyTestAttribute(Option o1) : this(new Option[] { o1 }) {} 
    public MyTestAttribute(Option o1, Option o2) : 
     this(new Option[] { o1, o2 }) {} 

    MyTestAttribute (Options[] options) 
    { 
     .... 
    } 
} 

नोट: यह हास्यास्पद यह है कि CLS के बारे में दी गई विशेषता वर्ग आंतरिक है complianed जा रहा है। AFAIK, सीएलएस केवल संभावित बाहरी सदस्यों (सार्वजनिक/संरक्षित) पर मान्य होना है।

+0

यह विशेषता की परिभाषा पर शिकायत नहीं कर रहा है (यह सार्वजनिक है अगर यह सार्वजनिक है), यह सार्वजनिक कॉल साइटों पर शिकायत कर रहा है। – SWeko

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

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