2010-07-21 9 views
6

मैं एक कस्टम विशेषता बनाया है वर्गों के एक नंबर है कि मैं क्रम में के लिए क्वेरी करना चाहते हैं को सजाने के लिए:गुण विरासत और प्रतिबिंब

[Example("BaseExample")] 
public abstract class ExampleContentControl : UserControl 
{ 
    // class contents here 
} 

public class DerivedControl : ExampleContentControl 
{ 
    // class contents here 
} 
:

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)] 
public class ExampleAttribute : Attribute 
{ 
    public ExampleAttribute(string name) 
    { 
     this.Name = name; 
    } 

    public string Name 
    { 
     get; 
     private set; 
    } 
} 

इन कक्षाओं में से प्रत्येक एक सार आधार वर्ग से निकाले जाते हैं

क्या मुझे प्रत्येक व्युत्पन्न कक्षा पर यह विशेषता डालने की ज़रूरत है, भले ही मैं इसे बेस क्लास में जोड़ूं? विशेषता विरासत के रूप में चिह्नित की जाती है, लेकिन जब मैं क्वेरी करता हूं, तो मुझे केवल बेस क्लास दिखाई देता है, न कि व्युत्पन्न कक्षाएं।

another thread से:

var typesWithMyAttribute = 
    from a in AppDomain.CurrentDomain.GetAssemblies() 
    from t in a.GetTypes() 
    let attributes = t.GetCustomAttributes(typeof(ExampleAttribute), true) 
    where attributes != null && attributes.Length > 0 
    select new { Type = t, Attributes = attributes.Cast<ExampleAttribute>() }; 

धन्यवाद, WTS

उत्तर

3

मैं उसी रूप में अपने कोड भाग गया, और निम्न परिणाम मिला:

{ Type = ConsoleApplication2.ExampleContentControl, Attributes = ConsoleApplication2.ExampleAttribute[] } 
{ Type = ConsoleApplication2.DerivedControl, Attributes = ConsoleApplication2.ExampleAttribute[] } 

तो यह काम करने के लिए लगता है ... आप सुनिश्चित हैं कि कुछ और नहीं चल रहा है?

+0

एक अन्य परियोजना में एक व्युत्पन्न वर्ग डालने की कोशिश करो, पहले संदर्भित। यदि मैंने व्युत्पन्न कक्षा को आधार के समान नामस्थान में रखा है, तो यह काम करता है। –

+0

ठीक है, आधे ने इसे समझ लिया - अन्य असेंबली तब तक लोड नहीं हुई जब LINQ क्वेरी को बुलाया गया था। मुझे लगता है कि सवाल तो बन जाता है, "मैं सभी विधानसभाओं कि मेरे निष्पादन योग्य (अर्थात मैं AppDomain.CurrentDomain.GetAssemblies (क्या स्थान लेते हैं) के साथ फोन) से जुड़े हैं कैसे मिलता है?" –

+0

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

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