5

En réponse à this question J'ai essayé d'utiliser Type.GetCustomAttributes(true) sur une classe qui implémente une interface qui a un attribut défini dessus. J'ai été surpris de découvrir que GetCustomAttributes n'a pas retourné l'attribut défini sur l'interface. Pourquoi pas? Les interfaces ne font-elles pas partie de la chaîne d'héritage?Dans .Net, pourquoi les attributs ne sont-ils pas déclarés sur les interfaces retournées lors de l'appel de Type.GetCustomAttributes (true)?

Exemple de code:

[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 
{ 
} 

Sorties: Rien

Répondre

8

Je ne Ne croyez pas que les attributs définis sur les interfaces implémentées peuvent être raisonnablement hérités. Considérez ce cas:

[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 { } 

Depuis l'attribut spécifie que les multiples ne sont pas autorisés, comment pensez-vous que cette situation à traiter?

+0

Ok, c'est logique. Je n'avais pas pensé à comment permettre cela serait comme l'ouverture de la boîte de vers de l'héritage multiple. Bonne réponse! –

+0

Merci! J'aime répondre aux questions avec plus de questions. :) – cdhowie

4

Parce que le type DoesntOverrideAttr ne possède pas d'attributs personnalisés. L'interface qu'il implémente ne (rappelez-vous, une classe ne hérite d'une interface ... il met en œuvre afin d'obtenir les attributs de la chaîne d'héritage sera toujours pas inclure des attributs d'interfaces):

// 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()); 
} 
Questions connexes