2016-12-27 1 views
1

Ich habe versucht, ein Attribut einer Eigenschaft zu verwenden, die in einer Schnittstelle deklariert wurde.Verwenden von Attribut der geerbten Eigenschaft von einer Schnittstelle

Angenommen:

[AttributeUsage(AttributeTargets.Property, Inherited=true)] 
class My1Attribute : Attribute 
{ 
    public int x { get; set; } 
} 

interface ITest 
{ 
    [My1] 
    int y { get; set; } 
} 

class Child : ITest 
{ 
    public Child() { } 

    public int y { get; set; } 
} 

nun von dem, was ich lese, GetCustomAttribute() mit Vererbung = true sollte die geerbte Attribut zurück, aber es sieht es nicht funktioniert.

Attribute my = typeof(Child).GetProperty("y").GetCustomAttribute(typeof(My1Attribute), true); // my == null 

Warum funktioniert es nicht? und wie kann ich das Attribut bekommen?

Antwort

1

Child hat keine benutzerdefinierte Attribute, ITest sie hat, so dass Sie GetCustomAttributes auf die Mitglieder des ITest verlangen.

Es gibt einen Unterschied zwischen Vererbung und Implementierung. Vererbung wäre in Ordnung, wenn Child von einer Basisklasse abgeleitet wurde, die eine y-Eigenschaft hat, die mit My1Attribute dekoriert ist.

In Ihrem Fall ChildimplementiertITest und ITest ist eine andere Art, außerhalb der Vererbungshierarchie.

void Main() 
{ 
    var my1Attribute = typeof(ITest).GetProperty("y").GetCustomAttribute(typeof(My1Attribute)) as My1Attribute; 
    Console.WriteLine(my1Attribute.x); // Outputs: 0 
} 

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
class My1Attribute : Attribute 
{ 
    public int x { get; set; } 
} 

interface ITest 
{ 
    [My1] 
    int y { get; set; } 
} 

class Child : ITest 
{ 
    public Child() { } 

    public int y { get; set; } 
} 
0

Dies ist nur eine Skizze, keine detaillierte Antwort. Es sollte eine Vorstellung davon geben, wie Sie das Attribut finden können, beginnend mit Child.

Sie können typeof(Child).GetInterfaces() verwenden, um ein Array zu erhalten, von dem Sie sehen, dass Child implementiert ITest. Angenommen t die typeof(ITest) Sie stieg aus dem Array, dann:

typeof(Child).GetInterfaceMap(t) 

wird Ihnen eine Struktur ("Karte"), um zu sehen, was die Eigenschaft Getter (get Accessor) get_y von Child (in .TargetMethods) entspricht in der Schnittstelle (.InterfaceMethods). Die Antwort ist natürlich eine andere get_y. Also, was Sie haben, ist die MethodInfo der get Accessor der y Eigenschaft in ITest. Um die Eigenschaft selbst zu finden, siehe z. this answer to Finding the hosting PropertyInfo from the MethodInfo of getter/setter. Sobald Sie die Eigenschafteninformationen haben, überprüfen Sie die benutzerdefinierten Attribute, um die My1Attribute und ihren Wert x zu finden.

Verwandte Themen