Question

Je dois être en mesure de récupérer les attributs personnalisés d'une classe à partir d'une méthode dans 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é):

//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 en mesure d'appeler cela de la contructor 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.

Était-ce utile?

La solution

Si vous avez utilisé des méthodes d'instance plutôt que des méthodes statiques, vous pouvez appeler this.GetType (), même 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 accomplit la mise en cache dans le constructeur que vous espériez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top