5

En respuesta a this question intenté usar Type.GetCustomAttributes(true) en una clase que implementa una interfaz que tiene un atributo definido en él. Me sorprendió descubrir que GetCustomAttributes no devolvió el atributo definido en la interfaz. ¿Por qué no? ¿Las interfaces no son parte de la cadena de herencia?En .Net, ¿por qué no se declaran atributos en las interfaces cuando se llama a Type.GetCustomAttributes (true)?

Código de ejemplo:

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

Salidas: Nada

Respuesta

8

i don No cree que los atributos definidos en las interfaces implementadas se puedan heredar de manera razonable. Considere este caso:

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

Dado que el atributo especifica que los múltiplos no se les permite, ¿cómo se puede esperar que esta situación se maneja?

+0

Ok, eso tiene sentido. No había pensado cómo permitir esto sería como abrir la lata de gusanos de herencia múltiple. ¡Buena respuesta! –

+0

¡Gracias! Me gusta responder preguntas con más preguntas. :) – cdhowie

4

Debido a que el tipo DoesntOverrideAttr no tiene ningún atributos personalizados. La interfaz que implementa no (recuerda, una clase no hereda de una interfaz ... que lo implementa así que conseguir los atributos de la cadena de herencia aún no incluirá los atributos de 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()); 
} 
Cuestiones relacionadas