Как мне вызвать GetCustomAttributes из базового класса? - PullRequest
1 голос
/ 01 декабря 2009

Мне нужно иметь возможность извлекать пользовательские атрибуты класса из метода в его базовом классе. Прямо сейчас я делаю это через защищенный статический метод в базовом классе со следующей реализацией (класс может иметь несколько примененных экземпляров одного и того же атрибута):

//Defined in a 'Base' class
protected static CustomAttribute GetCustomAttribute(int n) 
{
        return new StackFrame(1, false) //get the previous frame in the stack
                                        //and thus the previous method.
            .GetMethod()
            .DeclaringType
            .GetCustomAttributes(typeof(CustomAttribute), false)
            .Select(o => (CustomAttribute)o).ToList()[n];
}

Я называю это из производного класса так:

[CustomAttribute]
[CustomAttribute]
[CustomAttribute]
class Derived: Base
{
    static void Main(string[] args)
    {

        var attribute = GetCustomAttribute(2);

     }

}

В идеале я бы мог вызывать это из конструктора и кэшировать результаты.

Спасибо.

PS

Я понимаю, что GetCustomAttributes не гарантирует их возврат в отношении лексического порядка.

1 Ответ

8 голосов
/ 01 декабря 2009

Если вы используете методы экземпляра, а не статические методы, вы можете вызвать this.GetType (), даже из базового класса.

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
class CustomAttribute : Attribute
{}

abstract class Base
{
    protected Base()
    {
        this.Attributes = Attribute.GetCustomAttributes(this.GetType(), typeof(CustomAttribute))
            .Cast<CustomAttribute>()
            .ToArray();
    }

    protected CustomAttribute[] Attributes { get; private set; }
}

[Custom]
[Custom]
[Custom]
class Derived : Base
{
    static void Main()
    {
        var derived = new Derived();
        var attribute = derived.Attributes[2];
    }
}

Это проще и выполняет кэширование в конструкторе, на который вы надеялись.

...