जवाबों:
गुण एक सरणी ले जाएगा। यद्यपि यदि आप विशेषता को नियंत्रित करते हैं, तो आप 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 { }
आप इसे कर सकते हैं, लेकिन यह सीएलएस अनुपालन नहीं है:
[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
, जहां किसी भी विशेषता का केवल एक ही उदाहरण समर्थित है (या तो पहली या आखिरी जीत, मुझे याद नहीं है जो)।
निर्माणकर्ता को इस तरह घोषित करने का प्रयास करें:
public class MyCustomAttribute : Attribute
{
public MyCustomAttribute(params int[] t)
{
}
}
तब आप इसका उपयोग कर सकते हैं जैसे:
[MyCustomAttribute(3, 4, 5)]
यह ठीक होना चाहिए। युक्ति से, धारा 17.2:
यदि निम्नलिखित कथन में से सभी सत्य हैं, तो एक अभिव्यक्ति E एक विशेषता-तर्क-अभिव्यक्ति है:
यहाँ एक उदाहरण है:
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
{
}
हां, लेकिन आपको उस सरणी को आरंभीकृत करना होगा, जिसमें आप गुजर रहे हैं। यहां हमारी इकाई परीक्षणों में एक पंक्ति परीक्षण से एक उदाहरण है जो कमांड लाइन विकल्पों के एक चर संख्या का परीक्षण करता है;
[Row( new[] { "-l", "/port:13102", "-lfsw" } )]
public void MyTest( string[] args ) { //... }
मार्क ग्रेवेल के जवाब पर वापस गुल्लक करने के लिए, हाँ आप एरे पैरामीटर के साथ एक विशेषता को परिभाषित कर सकते हैं, लेकिन एरे पैरामीटर के साथ एक विशेषता को लागू करना सीएलएस-अनुरूप नहीं है। हालाँकि, किसी गुण को किसी सरणी गुण के साथ परिभाषित करना पूरी तरह से CLS- अनुरूप है।
मुझे यह एहसास हुआ कि Json.NET, एक CLS- आज्ञाकारी पुस्तकालय, JsonPropertyAttribute एक ऑब्जेक्ट की एक सरणी है जो ItemConverterParameters नामक संपत्ति के साथ एक विशेषता वर्ग है।