2009-08-28 11 views
8

में एक विशेषता है, मैंने एएट्रिब्यूट नामक एक कस्टम विशेषता बनाई है, और उदाहरण के लिए बी नामक एक वर्ग जहां एक या अधिक विधियां विशेषता का उपयोग करती हैं। क्या इस विधि के विधिइन्फो को प्राप्त करना संभव है जिसमें विशेषता है (इस मामले में BMethod1) के रूप में (इसमें से) के रूप में यह पूरी असेंबली के माध्यम से चलने के बिना गुणों और उनके गुणों के लिए सभी परिभाषित तरीकों को देख रहा है? और क्या उनके अन्य विशेषता लक्ष्य (पैरामीटर/प्रकार/गुण/...) के लिए उनका एक एनालॉग तरीका है? मैं उस प्रकार के गुणों का उपयोग करने वाले सभी तरीकों की एक सरणी नहीं चाहता हूं, लेकिन इस एटिरब्यूट-ऑब्जेक्ट के साथ केवल विधि में विधि। मैं विधि (रिटर्न प्रकार, पैरामीटर, नाम, अन्य विशेषता-उपयोग, ...) पर अतिरिक्त बाधा डालने के लिए इसका उपयोग करना चाहता हूं।प्रकार/विधि/... के लिए फास्ट एक्सेस जिसमें सी #

[AttributeUsage(AttributeTargets.Method)] 
public class AAtribute : Attribute { 

    //some fields and properties 

    public AAtribute() {//perhaps with some parameters 
     //some operations 
     MethodInfo mi;//acces to the MethodInfo with this Attribute 
         //as an Attribute (the question) 
     //some operations with the MethodInfo 
    } 

    //some methods 

} 

public class B { 

    //some fields, properties and constructors 

    [A] 
    public void BMethod1() { 
     //some operations 
    } 

    //other methods 

} 
+0

अच्छा सवाल, मैं भी जवाब जानना चाहता हूं ... –

उत्तर

2

अगर मैं सही ढंग अपने प्रश्न समझ में आया, आप विशेषता कोड अंदर पाने के लिए, चाहते हैं, वस्तु (इस मामले में एक विधि) जो विशेषता लागू किया जाता है करने के लिए।
मुझे पूरा यकीन है कि ऐसा करने का कोई सीधा तरीका नहीं है - विशेषता को उस ऑब्जेक्ट का कोई ज्ञान नहीं है जिस पर यह संलग्न है, यह एसोसिएशन एक और तरीका है।

सबसे अच्छा मैं तुम्हें कर सकते हैं सुझाव है निम्नलिखित की तरह एक वैकल्पिक हल:

using System; 
using System.Reflection; 

namespace test { 

    [AttributeUsage(AttributeTargets.Method)] 
    public class AAttribute : Attribute { 
     public AAttribute(Type type,string method) { 
      MethodInfo mi = type.GetMethod(method); 
     } 
    } 

    public class B { 
     [A(typeof(B),"BMethod1")] 
     public void BMethod1() { 
     } 
    } 
} 

नोट
क्या आप विशेषता के निर्माता के अंदर MethodInfo एक्सेस करके हासिल करना चाहते हैं? हो सकता है कि यदि आपके लक्ष्य प्राप्त करने के लिए एक वैकल्पिक तरीका ...

संपादित

एक और संभव समाधान के रूप में है, यदि आप अपनी विशेषता है कि जाँच करता है में एक स्थिर विधि प्रदान कर सकते हैं - लेकिन इस MethodInfos से अधिक बार-बार दोहराना शामिल है।

using System; 
using System.Reflection; 
namespace test { 

    [AttributeUsage(AttributeTargets.Method)] 
    public class AAttribute : Attribute { 
     public static void CheckType<T>() { 
      foreach (MethodInfo mi in typeof(T).GetMethods()) { 
       AAttribute[] attributes = (AAttribute[])mi.GetCustomAttributes(typeof(AAttribute), false); 
       if (0 != attributes.Length) { 
        // do your checks here 
       } 
      } 
     } 
    } 

    public class B { 
     [A] 
     public void BMethod1() { 
     } 
     [A] 
     public int BMethod2() { 
      return 0; 
     } 
    } 

    public static class Program { 
     public static void Main() { 
      AAttribute.CheckType<B>(); 
     } 
    } 
} 
+0

जैसा कि मैंने पहले ही कहा है, मैं इसमें additiol बाधा डालना चाहता हूं (वापसी प्रकार, पैरामीटर की संख्या, पैरामीटर के प्रकार, विधि का नाम, ...)। यदि विधि वैध नहीं है तो अपवाद को फेंक दिया जा सकता है। लेकिन जो भी कारण है, क्या यह तर्क नहीं होगा कि आप उस चीज़ तक पहुंच सकते हैं जहां विशेषता जुड़ी हुई है? –

+0

हां, लेकिन आप उन बाधाओं के साथ क्या करना चाहते हैं? जब तक आप इस प्रकार को किसी भी मामले में प्रतिबिंबित करने का प्रयास नहीं करते हैं, तब तक विशेषता को तत्काल नहीं किया जाएगा। –

0

यह पता लगाने के लिए कि किसी विधि के पास एक विशेषता है, तो आपके पास पहले से ही MethodInfo है।

var type = obj.GetType(); 
foreach(var method in type.GetMethods()) 
{ 
    var attributes = method.GetCustomAttributes(typeof(AAtribute)); 
    if(attributes.Length > 0) 
    { 
     //this method has AAtribute applied at least once 
    } 
}

+0

हाँ, लेकिन आप इसे विशेषता के अंदर से कैसे करते हैं? क्या यह जानने का कोई तरीका है कि किस विधि (या सदस्य) विशेषता का वर्तमान उदाहरण लागू होता है? –

2

मुझे लगता है कि उत्तर नहीं है। या कम से कम एक उचित तरीके से नहीं। विशेषता का उदाहरण केवल एक बार जब आप MethodInfo के माध्यम से विशेषता की तलाश करते हैं तो बनाया जाता है। उस वर्ग को इंस्टेंट करना जिसमें विशेषता है जिसमें विशेषता है, वह विशेषता को तुरंत चालू नहीं करेगा। विशेषता उदाहरण केवल तभी बनाए जाते हैं जब आप उन्हें प्रतिबिंब के माध्यम से ढूंढने के लिए चारों ओर घूमना शुरू कर देते हैं।