2013-06-17 11 views
9

मैं कैसे एक कस्टम विशेषता लिखने के लिए विधि मानकों को मान्य करने, यानी, इस फार्म बारी के उदाहरण खोजने के लिए संघर्ष कर रहा है:विधि पैरामीटर का उपयोग कैसे करें गुण

public void DoSomething(Client client) 
{ 
    if (client.HasAction("do_something")) 
    { 
     // ... 
    } 
    else 
    { 
     throw new RequiredActionException(client, "do_something"); 
    } 
} 
इस में

:

public void DoSomething([RequiredAction(Action="some_action")] Client client) 
{ 
    // ... 
} 

जहां तक ​​मेरा बता सकते हैं, मैं अपने कस्टम विशेषता से इस विशेषता को जोड़ने की जरूरत है, लेकिन मैं कैसे सजाया पैरामीटर Client उपयोग करने के लिए पर एक नुकसान में हूँ:

[AttributeUsageAttribute(AttributeTargets.Parameter)] 
public class RequireActionAttribute : System.Attribute 
{ 
    public Type Action {get; set;} 

    public RequireActionAttribute() 
    { 
     // .. How do you access the decorated parameter? 
     Client client = ??? 

     if (!client.HasAction(Action)) 
     { 
      throw new RequiredActionException(client, Action); 
     } 
    } 
} 
+0

आप पैरामीटर के रूप में इंटरफ़ेस को स्वीकार क्यों नहीं कर सकते? उदाहरण के लिए, आपके पास 'IDoSomething' हो सकता है। –

+2

आप विशेषता के अंदर से सजाए गए आइटम तक नहीं पहुंच सकते हैं। गुण मेटा-डेटा प्रकार के अनुसार स्थिर रूप से बैठते हैं, इसलिए आपको वास्तव में आइटम से विशेषता मिलती है। उस ने कहा, विशेषता तब एक विधि हो सकती है जो एक तर्क लेती है जो वस्तु है, लेकिन फिर आप एक अखरोट को तोड़ने के लिए एक स्लेजहैमर का उपयोग कर रहे हैं और गुणों के बिना इसे बहुत आसान बना सकते थे। –

उत्तर

15

आप इसे सही तरीके से लागू कर रहे हैं - लेकिन मूल रूप से एक विशेषता उस सदस्य को नहीं जानता जो इसका संदर्भ है। यह निश्चित रूप से जीवन कठिन बनाता है।

इतना ही नहीं है कि यह सदस्य है कि यह को संदर्भित करता है के लिए उपयोग नहीं किया है, लेकिन यह है कि सदस्य एक ParameterInfo, नहीं एक Client होगा - वहाँ बाहर से एक पैरामीटर के मूल्य तक पहुँचने का कोई आसान तरीका है। उचित तरीके से इसे संभालने के लिए client के मान को पारित करने के लिए आपकी विधि को कुछ सहायक कोड पर कॉल करने की आवश्यकता होगी ... या आपको विशेषता को नोटिस करने के लिए अपनी विधि को कॉल करने के लिए कॉल करने वाले कोड में हुक करने की आवश्यकता है।

यह स्पष्ट नहीं है कि आप इसका उपयोग करने की उम्मीद कर रहे थे, लेकिन यह हो सकता है कि आपको अपना डिज़ाइन महत्वपूर्ण रूप से बदलना होगा।

0

गुण शायद विधि पर ही डाले जाने चाहिए। जब मैं समाधान की तलाश में था तो मुझे निम्न लिंक मिला और जिस तरह से यह इंटरसेप्टर का उपयोग करता है, वह भी बेहतर लगता है http://www.codinginstinct.com/2008/05/argument-validation-using-attributes.html

+0

क्या आप थोड़ा और समझा सकते हैं? –

+0

मैंने मूल कोड को गलत समझा होगा। मैंने जो लिंक पोस्ट किया है वह कोड को सत्यापित करने के लिए इंटरसेप्टर का उपयोग करता है। टिप्पणी मुझे वहां से कोड पोस्ट करने की अनुमति नहीं देती है। यह सिर्फ मुझे लगता है कि यह समाधान अतीत में किए गए विशेषता सत्यापन से अधिक सुरुचिपूर्ण दिखता है। – Tony

2

विशेषताएँ ऐसा करने के लिए पर्याप्त नहीं हैं।

यदि मैं आपको सही ढंग से समझता हूं तो आप रन टाइम पर इसे सत्यापित करने के लिए पैरामीटर पर एक विशेषता जोड़ना चाहते हैं और यह केवल गुणों के साथ असंभव है।

यह असंभव है क्योंकि विशेषताएं केवल "मेटाडाटा" हैं और कोड निष्पादित नहीं हैं।

आपको इसे पढ़ने के लिए कुछ "वास्तविक" कोड की आवश्यकता होगी और तदनुसार कार्य करें। उस कोड को संकलित समय पर इंजेक्शन दिया जा सकता है या आप फंक्शन निष्पादन में हुक कर सकते हैं।

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