2010-07-21 12 views
6

Stworzyłem niestandardowy atrybut do dekoracji szereg klas, które chcę, aby zapytać o czasie wykonywania:Atrybut spadków i odbicie

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

    public string Name 
    { 
     get; 
     private set; 
    } 
} 

Każda z tych klas wynikają z abstrakcyjnej klasy bazowej:

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

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

Czy muszę umieścić ten atrybut na każdej klasie pochodnej, nawet jeśli dodaję ją do klasy bazowej? Atrybut jest oznaczony jako dziedziczny, ale gdy wykonuję zapytanie, widzę tylko klasę podstawową, a nie klasy pochodne.

Od 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>() }; 

Dzięki, WTS

Odpowiedz

3

Pobiegłem swój kod, jak jest, i mam następujący wynik:

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

Wydaje się więc do pracy ... Jesteś pewien, że coś innego się nie dzieje?

+0

Spróbuj wstawić klasę pochodną do innego projektu, odwołując się do pierwszego. Jeśli umieściłem pochodną klasę w tej samej przestrzeni nazw co baza, to działa. –

+0

Cóż, połowa się domyśliła - inne zespoły nie zostały jeszcze załadowane, gdy wywołano kwerendę LINQ. Domyślam się, że wtedy pojawia się pytanie: "w jaki sposób uzyskać wszystkie zestawy, które są związane z moim plikiem wykonywalnym (tj. Co zastąpić wywołaniem AppDomain.CurrentDomain.GetAssemblies() z)?" –

+0

Dobrze, to ma sens ... musisz znaleźć sposób na wymuszenie obciążenia na wszystkich złożeniach, które mogą mieć znaczenie. To naprawdę zależy od struktury Twojej aplikacji. Jeśli na przykład wszystkie zestawy zostaną załadowane z folderu, w którym działa aplikacja, można przeskanować i wymusić załadowanie. Jeśli robisz coś egzotycznego, np. Przekierowujesz obciążenia montażowe ... jest to trudniejsze. Jeśli wiesz z wyprzedzeniem, które zgromadzenia oczekujesz, najprościej jest po prostu odwołać się do jakiegoś typu w każdym z tych zespołów. –