5

Als Antwort auf this question habe ich versucht Type.GetCustomAttributes(true) für eine Klasse zu verwenden, die eine Schnittstelle implementiert, für die ein Attribut definiert ist. Ich war überrascht zu entdecken, dass GetCustomAttributes das an der Schnittstelle definierte Attribut nicht zurückgegeben hat. Warum nicht? Sind Schnittstellen nicht Teil der Vererbungskette?In .Net, warum werden Attribute, die für Interfaces zurückgegeben werden, nicht zurückgegeben, wenn Type.GetCustomAttributes (true) aufgerufen wird?

Beispielcode:

[Attr()] 
public interface IInterface { } 

public class DoesntOverrideAttr : IInterface { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (var attr in typeof(DoesntOverrideAttr).GetCustomAttributes(true)) 
      Console.WriteLine("DoesntOverrideAttr: " + attr.ToString()); 
    } 
} 

[AttributeUsage(AttributeTargets.All, Inherited = true)] 
public class Attr : Attribute 
{ 
} 

Ausgänge: Nichts

Antwort

8

I don Ich glaube, Attribute, die auf implementierten Schnittstellen definiert sind, können vernünftigerweise vererbt werden. Betrachten wir diesen Fall:

[AttributeUsage(Inherited=true, AllowMultiple=false)] 
public class SomethingAttribute : Attribute { 
    public string Value { get; set; } 

    public SomethingAttribute(string value) { 
     Value = value; 
    } 
} 

[Something("hello")] 
public interface A { } 

[Something("world")] 
public interface B { } 

public class C : A, B { } 

Da das Attribut gibt an, dass Multiples nicht erlaubt sind, wie würden Sie erwarten, dass diese Situation behandelt werden?

+0

Ok, das macht Sinn. Ich hatte nicht darüber nachgedacht, wie das möglich wäre, als würde ich die Mehrfachvererbung von Würmern öffnen. Gute Antwort! –

+0

Danke! Ich beantworte gerne Fragen mit mehr Fragen. :) – cdhowie

4

Da der Typ DoesntOverrideAttr keine benutzerdefinierte Attribute hat. Die Schnittstelle, die es implementiert ist (denken Sie daran, eine Klasse erbt nicht von einer Schnittstelle ... es setzt sie so Attribute up immer die Vererbungskette immer noch nicht Attribute von Schnittstellen umfassen):

// This code doesn't check to see if the type implements the interface. 
// It should. 
foreach(var attr in typeof(DoesntOverrideAttr) 
         .GetInterface("IInterface") 
         .GetCustomAttributes(true)) 
{ 
    Console.WriteLine("IInterface: " + attr.ToString()); 
} 
Verwandte Themen