Question

I'm trying to use GetCustomAttributes() to get an attribute defined on a property. The issue is that the property is an overridden one and I can't work out how to extract the overridden one from the expression. I can only work out how to get the base class's one.

Here's some code

public class MyAttribute : Attribute 
{
  //... 
}

public abstract class Text
{
  public abstract string Content {get; set;}
}

public class Abstract : Text
{
  [MyAttribute("Some Info")]
  public override string Content {get; set;}
}

Now I am trying to get the MyAttribute out of the abstract class. But I need to get it via an Expression. This is what I have been using:

Expression<Func<Abstract, string>> expression =  c => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;

var attrs = Attribute.GetCustomAttributes(memberType, true);

Unfortunately atts ends up as empty. The problem is that menberType ends up being for Text.Content instead of the Abstract.Content class. So when I get the attributes, it returns nothing.

Was it helpful?

Solution

It is not working because the MemberExpression ignores the overrides and returns the property form the base type Text that's why you don't find your attribute.

You can read about this problem here: How to get the child declaring type from an expression?

However you have all the information in the expression and you can get your attribute with a little more reflection (quick and dirty sample):

Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;

var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top