क्या मैं किसी सरणी या अन्य चर संख्या के तर्क के साथ C # विशेषता को प्रारंभ कर सकता हूं?


105

क्या एक विशेषता बनाना संभव है जिसे तर्कों की चर संख्या के साथ आरंभ किया जा सकता है?

उदाहरण के लिए:

[MyCustomAttribute(new int[3,4,5])]  // this doesn't work
public MyClass ...

12
आपके पास सिर्फ सरणी के लिए अपना सिंटैक्स गलत है। यह "नया इंट [] {3,4,5}" होना चाहिए।
डेविड वेंगियर 20

जवाबों:


178

गुण एक सरणी ले जाएगा। यद्यपि यदि आप विशेषता को नियंत्रित करते हैं, तो आप paramsइसके बजाय उपयोग कर सकते हैं (जो उपभोक्ताओं के लिए अच्छा है, IMO):

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(params int[] values) {
       this.Values = values;
    }
}

[MyCustomAttribute(3, 4, 5)]
class MyClass { }

सरणी निर्माण के लिए आपका सिंटैक्स बस बंद हो जाता है:

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(int[] values) {
        this.Values = values;
    }
}

[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }

33

आप इसे कर सकते हैं, लेकिन यह सीएलएस अनुपालन नहीं है:

[assembly: CLSCompliant(true)]

class Foo : Attribute
{
    public Foo(string[] vals) { }
}
[Foo(new string[] {"abc","def"})]
static void Bar() {}

दिखाता है:

Warning 1   Arrays as attribute arguments is not CLS-compliant

नियमित रूप से परावर्तन के उपयोग के लिए, कई गुण यों का होना बेहतर हो सकता है

[Foo("abc"), Foo("def")]

हालांकि, यह TypeDescriptor/ के साथ काम नहीं करेगा PropertyDescriptor, जहां किसी भी विशेषता का केवल एक ही उदाहरण समर्थित है (या तो पहली या आखिरी जीत, मुझे याद नहीं है जो)।


3
नोट: कई विशेषताओं को आपकी विशेषता पर विशेषता विशेषता की आवश्यकता होती है। stackoverflow.com/questions/553540/…
russau

23

निर्माणकर्ता को इस तरह घोषित करने का प्रयास करें:

public class MyCustomAttribute : Attribute
{
    public MyCustomAttribute(params int[] t)
    {
    }
}

तब आप इसका उपयोग कर सकते हैं जैसे:

[MyCustomAttribute(3, 4, 5)]


12

यह ठीक होना चाहिए। युक्ति से, धारा 17.2:

यदि निम्नलिखित कथन में से सभी सत्य हैं, तो एक अभिव्यक्ति E एक विशेषता-तर्क-अभिव्यक्ति है:

  • E का प्रकार एक विशेषता पैरामीटर प्रकार (.317.1.3) है।
  • संकलन-समय पर, ई के मूल्य को निम्न में से एक में हल किया जा सकता है:
    • एक स्थिर मूल्य।
    • एक System.Type ऑब्जेक्ट।
    • विशेषता-तर्क-अभिव्यक्तियों का एक-आयामी सरणी ।

यहाँ एक उदाहरण है:

using System;

[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SampleAttribute : Attribute
{
    public SampleAttribute(int[] foo)
    {
    }
}

[Sample(new int[]{1, 3, 5})]
class Test
{
}

5
, सीएलएस अनुपालन से सावधान रहें, हालांकि
मार्क Gravell

4

हां, लेकिन आपको उस सरणी को आरंभीकृत करना होगा, जिसमें आप गुजर रहे हैं। यहां हमारी इकाई परीक्षणों में एक पंक्ति परीक्षण से एक उदाहरण है जो कमांड लाइन विकल्पों के एक चर संख्या का परीक्षण करता है;

[Row( new[] { "-l", "/port:13102", "-lfsw" } )]
public void MyTest( string[] args ) { //... }

2

तुम यह कर सकते हो। एक और उदाहरण हो सकता है:

class MyAttribute: Attribute
{
    public MyAttribute(params object[] args)
    {
    }
}

[MyAttribute("hello", 2, 3.14f)]
class Program
{
    static void Main(string[] args)
    {
    }
}

1

मार्क ग्रेवेल के जवाब पर वापस गुल्लक करने के लिए, हाँ आप एरे पैरामीटर के साथ एक विशेषता को परिभाषित कर सकते हैं, लेकिन एरे पैरामीटर के साथ एक विशेषता को लागू करना सीएलएस-अनुरूप नहीं है। हालाँकि, किसी गुण को किसी सरणी गुण के साथ परिभाषित करना पूरी तरह से CLS- अनुरूप है।

मुझे यह एहसास हुआ कि Json.NET, एक CLS- आज्ञाकारी पुस्तकालय, JsonPropertyAttribute एक ऑब्जेक्ट की एक सरणी है जो ItemConverterParameters नामक संपत्ति के साथ एक विशेषता वर्ग है।

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