2009-04-06 18 views
31

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

मैं AppDomain.CurrentDomain देख रहा था, लेकिन मैं बहुत ज्यादा नहीं है और इससे परिचित यकीन है कि कैसे elivated privlages होने के लिए (मैं यदि संभव हो तो न्यूनतम विश्वास के साथ एक वेब एप्लिकेशन में पुस्तकालय चलाने के लिए सक्षम होना चाहता हूँ की जरूरत नहीं हूँ, लेकिन जितना अधिक मैं विश्वास करता हूं उतना ही भरोसा करता हूं)। मैं प्रदर्शन को ध्यान में रखना चाहता हूं (यह एक .NET 3.5 लाइब्रेरी है इसलिए LINQ पूरी तरह मान्य है!)।

तो AppDomain.CurrentDomain मेरा सर्वोत्तम/केवल विकल्प है और फिर सभी असेंबली के माध्यम से बस लूपिंग, और फिर उन विधानसभाओं में टाइप करें? या फिर कोई और तरीका

उत्तर

80
IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) 
           where TAttribute: System.Attribute 
{ return from a in AppDomain.CurrentDomain.GetAssemblies() 
      from t in a.GetTypes() 
      where t.IsDefined(typeof(TAttribute),inherit) 
      select t; 
} 
+1

सरल और व्यावहारिक समाधान। इसके लिए +1! –

+0

अच्छी चीजें - धड़कन के पास बहुत कुछ है! – Mike

+0

यह वही है जो मुझे चाहिए! धन्यवाद! –

0

मार्क एक अच्छा उत्तर पोस्ट है, लेकिन यहाँ एक LINQ मुक्त यदि आप इसे पसंद करते हैं संस्करण है:

public static IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) where TAttribute : Attribute 
    { 
     var output = new List<Type>(); 

     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

     foreach (var assembly in assemblies) 
     { 
      var assembly_types = assembly.GetTypes(); 

      foreach (var type in assembly_types) 
      { 
       if (type.IsDefined(typeof(TAttribute), inherit)) 
        output.Add(type); 
      } 
     } 

     return output; 
    } 
संबंधित मुद्दे