Frage

Ich muss in der Lage, die benutzerdefinierte Attribute einer Klasse von einem Verfahren in seiner Basisklasse abzurufen. Im Moment habe ich es über eine geschützte statische Methode in der Basisklasse mit der folgenden Umsetzung mache (die Klasse mehrere Instanzen des gleichen Attribut zugewiesen werden):

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

Ich nenne es von einer abgeleiteten Klasse thusly:

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

        var attribute = GetCustomAttribute(2);

     }

}

Im Idealfall würde ich in der Lage sein, dies von der contructor aufrufen und die Ergebnisse zwischenzuspeichern.

Danke.

PS

Ich weiß, dass GetCustomAttributes nicht auf lexikalische Reihenfolge in Bezug auf sich zurück garantiert.

War es hilfreich?

Lösung

Wenn Sie Instanzmethoden verwendet, anstatt statische Methoden, man konnte this.GetType () aufrufen, auch von der Basisklasse.

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

Es ist einfacher, und führt das Caching in den Konstruktor, die Sie erhofft haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top