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
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. –
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)?" –
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. –