Наследование и отражение атрибута - PullRequest
6 голосов
/ 21 июля 2010

Я создал собственный атрибут для украшения ряда классов, к которым я хочу запросить во время выполнения:

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

    public string Name
    {
        get;
        private set;
    }
}

Каждый из этих классов является производным от абстрактного базового класса:

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

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

Нужно ли помещать этот атрибут в каждый производный класс, даже если я добавлю его в базовый класс?Атрибут помечается как наследуемый, но когда я выполняю запрос, я вижу только базовый класс, а не производные классы.

Из другой поток :

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

1 Ответ

3 голосов
/ 21 июля 2010

Я запустил ваш код как есть и получил следующий результат:

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

Так что, похоже, работает ... Вы уверены, что что-то еще не происходит?

...