2010-02-07 14 views
5

मैं इस तरह एक मार्कर इंटरफेस कुछ है:वहाँ एक तेज/बेहतर तरीके विशेषता है कि प्राप्त करने के लिए रास्ता नहीं है में लागू सी #

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)] 
public class MyAttribute : Attribute 
{ 
} 

और मैं अलग विधानसभाओं में विभिन्न वर्गों पर तरीकों पर लागू करना चाहते हैं। ..

फिर मैं इस विधि को लागू करने वाले सभी तरीकों के लिए एक MethodInfo प्राप्त करना चाहता हूं। मुझे पूरे ऐपडोमेन को खोजने और इन सभी तरीकों का संदर्भ प्राप्त करने की आवश्यकता है।

मुझे पता है कि हम सभी प्रकार प्राप्त कर सकते हैं और फिर सभी विधियां प्राप्त कर सकते हैं, लेकिन क्या ऐसा करने का एक तेज़/बेहतर तरीका है? ... या क्या मुझे यह जानकारी प्राप्त करने का सबसे तेज़ तरीका है?

(मैं ASP.NET MVC 1.0 का उपयोग कर रहा हूँ, सी #, ./NET 3.5)

धन्यवाद ढेर!

उत्तर

14

आखिरकार, नहीं - आपको उन्हें स्कैन करना होगा। LINQ हालांकि यह काफी दर्द मुक्त बनाता है।

 var qry = from asm in AppDomain.CurrentDomain.GetAssemblies() 
        from type in asm.GetTypes() 
        from method in type.GetMethods() 
        where Attribute.IsDefined(method, typeof(MyAttribute)) 
        select method; 

नोट यह केवल स्कैन विधानसभाओं लोड "जैसा है"।

+0

कि मार्क के लिए धन्यवाद! और linq क्वेरी के लिए ... और चेतावनी ... मुझे और अन्य भी मदद करता है मुझे यकीन है। मैं एएसपी.नेट एमवीसी का उपयोग कर रहा हूं ... मैंने फिर से परीक्षण किया: एएसपी.नेट में क्लास लोडिंग क्योंकि मैंने पाया कि मेरे कुछ यूनिट परीक्षणों ने बाह्य असेंबली लोड नहीं की जब तक कि एक प्रकार का संदर्भ नहीं दिया गया ... एएसपी.नेट लगता है AppDomain में सब कुछ लोड करें शुक्रिया ... फिर से धन्यवाद। – jwwishart

0

मैंने कुछ हफ्ते पहले भी इसकी खोज की है। मुझे लगता है कि कोई आसान तरीका नहीं है।
आप LINQ के साथ थोड़ा सा स्पिफी कर सकते हैं।

+0

यही वह था जो मैंने सोचा था! धन्यवाद – jwwishart

2

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

यदि विशेषता उपयोगकर्ता परिभाषित (.NET फ्रेमवर्क में नहीं बनाई गई है), तो जब आप प्रकार प्राप्त करने के लिए असेंबली का आकलन कर रहे हैं, तो आपको फ्रेमवर्क असेंबली जैसे एमएसकोरिब और सिस्टम को छोड़ना चाहिए।

+0

perf संकेतों के लिए धन्यवाद! अगर मैं कर सकता तो मैं वोट दूंगा ... – jwwishart

2

यदि आपको वास्तव में प्रदर्शन लाभ की आवश्यकता है, तो Marc suggested के रूप में करें और फिर परिणामों को एक फ़ाइल में कैश करें। अगली बार अनुप्रयोग लोड, यदि कैश्ड फ़ाइल मौजूद है, तो यह प्रत्येक असेंबली को पार्स किए बिना उचित विधि लोड कर सकती है।

यहाँ एक संभव कैश फ़ाइल का एक उदाहरण है:

<attributeCache> 

    <assembly name='Assembly1' filename='Assembly1.dll' timestamp='02/02/2010'> 
    <type name='Assembly1.Type1'> 
     <method name='Method1'/> 
    </type> 
    </assembly> 

<assembly name='Assembly2' filename='Assembly2.dll' timestamp='02/02/2010' /> 
</attributeCache> 
संबंधित मुद्दे