2009-08-05 31 views
54

में वस्तुओं पारित करने के लिए मैं इस प्रकार एक गुण निर्माता में वस्तुओं पारित करने के लिए प्रयास कर रहा हूँ:कैसे एक विशेषता निर्माता

[PropertyValidation(new NullOrEmptyValidatorScheme())] 
public string Name { get; private set; } 
इस विशेषता निर्माता के साथ

:

public PropertyValidationAttribute(IValidatorScheme validator) { 
     this._ValidatorScheme = validator; 
    } 

कोड संकलन नहीं होंगे। मैं उपरोक्त के रूप में किसी ऑब्जेक्ट को किसी ऑब्जेक्ट में कैसे पास कर सकता हूं?

संपादित करें: हाँ NullOrEmptyValidatorScheme लागू करता है IValidatorScheme।

त्रुटि: त्रुटि CS0182: एक विशेषता तर्क एक निरंतर अभिव्यक्ति, टाइपो अभिव्यक्ति या एक विशेषता पैरामीटर प्रकार की सरणी निर्माण अभिव्यक्ति होना चाहिए।

+0

संकलन त्रुटि क्या है? क्या आप निश्चित हैं कि 'NullOrEmptyValidatorScheme' 'IValidatorScheme' लागू करता है? –

+0

विशेषता वाक्यविन्यास का संबंध है, यह मान्य कोड है, इसलिए यह आपके ऑब्जेक्ट्स के बारे में कुछ होना चाहिए। –

+2

@ केक 444 - नहीं, यह नहीं है ... मैं अपने जवाब में spec अनुभाग जोड़ रहा हूं ... –

उत्तर

65

गुणों में मान सरल प्रकार तक सीमित हैं; उदाहरण के लिए, मूल स्थिरांक (तार सहित) और typeof ... आप new या अन्य जटिल कोड का उपयोग नहीं कर सकते हैं। संक्षेप में; आप यह नहीं कर सकते आप इसे प्रकार हालांकि दे सकते हैं:

[PropertyValidation(typeof(NullOrEmptyValidatorScheme)] 

अर्थात PropertyValidation ctor एक Type लेता है, और कोड के अंदर Activator.CreateInstance का उपयोग वस्तु बनाने के लिए। ध्यान दें कि आपको आदर्श रूप से आंतरिक रूप से स्ट्रिंग को स्टोर करना चाहिए (AssemblyQualifiedName)।

ECMA 334v4 से

:

§24.1.3 Attribute parameter types

The types of positional and named parameters for an attribute class are limited to the attribute parameter types, which are:

  • One of the following types: bool , byte , char , double , float , int , long , short , string .
  • The type object .
  • The type System.Type .
  • An enum type, provided it has public accessibility and the types in which it is nested (if any) also have public accessibility.
  • Single-dimensional arrays of the above types.

और

§24.2 Attribute specification

...

An expression E is an attribute-argument-expression if all of the following statements are true:

  • The type of E is an attribute parameter type (§24.1.3).
  • At compile-time, the value of E can be resolved to one of the following:
    • A constant value.
    • A typeof-expression (§14.5.11) specifying a non-generic type, a closed constructed type (§25.5.2), or an unbound generic type (§25.5).
    • A one-dimensional array of attribute-argument-expressions.
+0

यह एक मूल्यवान मूल्यों में से एक का एक दूसरा संदर्भ है, हालांकि यह लागू करना छोटा नहीं है। क्या आप enum का उपयोग कर किसी भी उदाहरण कार्यान्वयन के बारे में जानते हैं? – QueueHammer

+0

@QueueHammer '[DefaultValue (AnyEnum.SomeValue)]' पर्याप्त होना चाहिए; अन्यथा, '[System.Xml.Serialization.XmlElement (फॉर्म = System.Xml.Schema.XmlSchemaForm.Qualified) जैसे कुछ'] –

10

जैसा कि पिछले पोस्टर का उल्लेख किया, प्रकार, विशेषता तर्क में उपयोग काफी गंभीर रूप से प्रतिबंधित कर रहे हैं (जाहिर है क्योंकि उनके मूल्यों में सीधे धारावाहिक करने की आवश्यकता है असेंबली मेटाडाटा ब्लॉब)।

कहा कि, तो आप शायद, एक समाधान है कि typeofs का इस्तेमाल करता है बना सकते हैं के रूप में उन इस्तेमाल किया जा सकता।

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

[PropertyValidation(typeof(NullOrEmptyValidatorScheme))] 
public string Name { get; private set; } 

इस वाक्य रचना पूरी तरह से कानूनी है। कोड जो आपके गुणों को पढ़ता है, आपको सत्यापनकर्ता प्रकार प्राप्त करना होगा, सत्यापनकर्ता का एक नया उदाहरण बनाएं (यह उचित होने पर वैल्यूएटर प्रकारों पर की गई वैधकर्ताओं का कैश भी बनाए रख सकता है - यह एक काफी आम तकनीक है), और उसके बाद इसे आमंत्रित करें ।

+0

आपके उत्तर देने के लिए धन्यवाद। मैंने मार्क को स्वीकार्य उत्तर दिया है। लेकिन कैश का उपयोग करने का आपका सुझाव सहायक है, और कई एक्टिवेटर से बचाने के लिए ऐसा करने की कल्पना की गई थी। क्रिएट इंस्टेंस कॉल। – theringostarrs

5
इसके अलावा

... (मुझे लगता है कि यह एक Microsoft बग है)

आप एक डिफ़ॉल्ट मान पर "अशक्त" नहीं डाल लेकिन सरल डिफ़ॉल्ट मान डिफ़ॉल्ट कर सकते हैं ठीक है ('गलत', '7', ' "परीक्षा")।

अगले उदाहरण आपको निम्न त्रुटि दे देंगे: एक विशेषता तर्क, एक निरंतर अभिव्यक्ति होना चाहिए typeof एक विशेषता पैरामीटर प्रकार की अभिव्यक्ति या सरणी निर्माण अभिव्यक्ति
फ़ाइल में: ... \ सीएससी

public class SampleAttribute : Attribute 
{ 
    private string _test; 
    public SampleAttribute(string test = null) 
    { 
     _test = test; 
    } 
} 

[Sample] 
public class Toto 
{ 

} 
+0

संबंधित हो सकता है: "विशेषताएँ और नामांकित/वैकल्पिक कन्स्ट्रक्टर पैरामीटर काम नहीं कर रहे हैं" http://stackoverflow.com/q/8189807/276648 – user276648

+0

उपयोगकर्ता 276648 पर, मुझे लगता है कि आप सही हैं, वे संबंधित हैं और समाधान अधिक पूर्ण प्रतीत होता है । धन्यवाद ! –

+0

असल में आपके नमूने के साथ यह एक कंपाइलर बग से संबंधित हो सकता है (जिसका अर्थ है कि आपने जो लिखा है वह मोनो द्वारा संकलित किए जाने पर काम कर सकता है) http://stackoverflow.com/q/8290853 – user276648

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