Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I ignore the inheritance chain when getting attributes?

For some reason I'm not getting this. (Example model below) If I write:

var property = typeof(sedan).GetProperty("TurningRadius");
Attribute.GetCustomAttributes(property,typeof(MyAttribute), false)

the call will return MyAttribute(2) despite indicating I don't want to search the inheritance chain. Does anyone know what code I can write so that calling

MagicAttributeSearcher(typeof(Sedan).GetProperty("TurningRadius"))

returns nothing while calling

MagicAttributeSearcher(typeof(Vehicle).GetProperty("TurningRadius"))

returns MyAttribute(1)?


Example Model:

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

public class Car : Vehicle
{
    [MyAttribute(2)]
    public override int TurningRadius { get; set; }
}

public abstract class Vehicle
{
    [MyAttribute(1)]
    public virtual int TurningRadius { get; set; }
}
like image 611
Dane O'Connor Avatar asked Jan 22 '26 21:01

Dane O'Connor


1 Answers

Okay, given the extra information - I believe the problem is that GetProperty is going up the inheritance change.

If you change your call to GetProperty to:

PropertyInfo prop = type.GetProperty("TurningRadius",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

then prop will be null if the property isn't overridden. For instance:

static bool MagicAttributeSearcher(Type type)
{
    PropertyInfo prop = type.GetProperty("TurningRadius", BindingFlags.Instance | 
                                         BindingFlags.Public | BindingFlags.DeclaredOnly);

    if (prop == null)
    {
        return false;
    }
    var attr = Attribute.GetCustomAttribute(prop, typeof(MyAttribute), false);
    return attr != null;
}

This returns true and only if:

  • The specified type overrides the TurningRadius property (or declares a new one)
  • The property has the MyAttribute attribute.
like image 149
Jon Skeet Avatar answered Jan 24 '26 13:01

Jon Skeet