2008-11-07 7 views
5

Por lo tanto, si tengo:¿Cómo se pueden obtener todos los atributos en la interfaz de una propiedad/ascendencia del tipo de base?

public class Sedan : Car 
{ 
    /// ... 
} 

public class Car : Vehicle, ITurn 
{ 
    [MyCustomAttribute(1)] 
    public int TurningRadius { get; set; } 
} 

public abstract class Vehicle : ITurn 
{ 
    [MyCustomAttribute(2)] 
    public int TurningRadius { get; set; } 
} 

public interface ITurn 
{ 
    [MyCustomAttribute(3)] 
    int TurningRadius { get; set; } 
} 

¿Qué magia puedo usar para hacer algo como:

[Test] 
public void Should_Use_Magic_To_Get_CustomAttributes_From_Ancestry() 
{ 
    var property = typeof(Sedan).GetProperty("TurningRadius"); 

    var attributes = SomeMagic(property); 

    Assert.AreEqual(attributes.Count, 3); 
} 

Tanto

property.GetCustomAttributes(true); 

Y

Attribute.GetCustomAttributes(property, true); 

Solo devuelve 1 atributo. La instancia es la que está construida con MyCustomAttribute (1). Esto no parece funcionar como se esperaba.

Respuesta

2
object[] SomeMagic (PropertyInfo property) 
{ 
    return property.GetCustomAttributes(true); 
} 

ACTUALIZACIÓN:

Desde mi respuesta anterior no funciona, por qué no probar algo como esto:

public void Should_Use_Magic_To_Get_CustomAttributes_From_Ancestry() 
{ 

    Assert.AreEqual(checkAttributeCount (typeof (Sedan), "TurningRadious"), 3); 
} 


int checkAttributeCount (Type type, string propertyName) 
{ 
     var attributesCount = 0; 

     attributesCount += countAttributes (type, propertyName); 
     while (type.BaseType != null) 
     { 
      type = type.BaseType; 
      attributesCount += countAttributes (type, propertyName); 
     } 

     foreach (var i in type.GetInterfaces()) 
      attributesCount += countAttributes (type, propertyName); 
     return attributesCount; 
} 

int countAttributes (Type t, string propertyName) 
{ 
    var property = t.GetProperty (propertyName); 
    if (property == null) 
     return 0; 
    return (property.GetCustomAttributes (false).Length); 
} 
+0

En el ejemplo proporcionado, la afirmación falla. Devuelve 1 atributo, no todos 3. –

+0

Tiene razón, eso es porque es realmente solo un atributo personalizado. – albertein

+0

Si cambio la instancia del atributo, parece que solo devuelve el del auto. Entonces no busca después del auto. Ver pregunta actualizada Ty por la ayuda sin embargo. –

Cuestiones relacionadas