2009-12-01 5 views
1

Je dois être en mesure de récupérer les attributs personnalisés d'une classe à partir d'une méthode de sa classe de base. En ce moment je fais via une méthode statique protégée dans la classe de base avec la mise en œuvre suivante (la classe peut avoir plusieurs instances du même attribut appliqué):Comment appeler GetCustomAttributes à partir d'une classe de base?

//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]; 
} 

Je l'appelle d'une classe dérivée ainsi:

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

     var attribute = GetCustomAttribute(2); 

    } 

} 

Idéalement, je serais capable d'appeler cela du constructeur et mettre en cache les résultats.

Merci.

PS

Je me rends compte que GetCustomAttributes n'est pas garanti pour les retourner par rapport à l'ordre lexical.

Répondre

8

Si vous utilisiez des méthodes d'instance plutôt que des méthodes statiques, vous pourriez appeler this.GetType(), même à partir de la classe de base.

[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]; 
    } 
} 

Il est plus simple et réalise la mise en cache dans le constructeur que vous espériez.

+0

Merci. C'est une bonne chose mais j'en ai besoin pour travailler pour les célibataires. En regardant le cadre de la pile se sent hackish mais il garde l'API propre donc je m'en tiendrai à cela pour l'instant. J'ai accepté votre réponse, car cela peut aider les autres. –

Questions connexes