Question

I have a custom attribute like this:

public class PropertyInfoAttribute : Attribute
{
    public bool IsAutoComplete { get; set; }
}

And there is a class like this:

public class Article
{
    public virtual int Order { get; set; }
    //other properties
}

In another class,which inherits from Article, I override Order property and declare the attribute for it like this:

public class ArticleDetails : Article
{
    [PropertyInfo(IsAutoCompele = true)]
    public override int Order { get; set; }
}

The problem appears when I want to get attributes by using the GetCustomAttributes method in PropertyInfo class. I do it like this:

PropertyInfo propInfo = //do something for getting property info from the
                        //ArticleDetails class;

var attr = propInfo.GetCustomAttribute<PropertyInfoAttribute>();

But it returns nothing! I don't know why!

UPDATE:

I get property info in this method:

    public static void InitPropertyInfoAttribute<TModel, TProperty>(MvcHtmlString source, Expression<Func<TModel, TProperty>> expression)
    {
        PropertyInfo propInfo = (expression.Body as MemberExpression).Member as PropertyInfo;
    }
Was it helpful?

Solution

I think the problem hides in here:

PropertyInfo propInfo = //do something for getting property info from the
                        //ArticleDetails class;

I presume that you actually obtain this property info from Article class, not ArticleDetails and that's why it returns null. The following snippet worked as expected for me:

PropertyInfo propInfo = typeof(ArticleDetails).GetProperty("Order");
var attr = propInfo.GetCustomAttribute<PropertyInfoAttribute>();

Update


According to your update - the problem is that Member property of the MemberExpression points to the Article type;

As a solution to this you can update your InitPropertyInforAttribute as follows:

MemberExpression memberExpression = (expression.Body as MemberExpression);
return typeof(TModel).GetProperty(memberExpression.Member.Name);

And don't forget that you should pass ArticleDetails as first generic type parameter - InitPropertyInfoAttribute<ArticleDetails, propertyType>.

OTHER TIPS

Sorry, but I can't reproduce the error. Attribute is extracted. Could you provide the details?

// Your classes
public class PropertyInfoAttribute: Attribute {
  public bool IsAutoComplete {
    get;
    set;
  }
}

public class Article {
  public virtual int Order {
    get;
    set;
  }
}

public class ArticleDetails: Article {
  [PropertyInfo(IsAutoComplete = true)]
  public override int Order {
    get;
    set;
  }
}

...

// My test

// Let's do it explicitly:
// ask for public and instance (not static) property
PropertyInfo pi = typeof(ArticleDetails).GetProperty("Order", BindingFlags.Public | BindingFlags.Instance);
// Then ask for the attribute
Attribute at = pi.GetCustomAttribute(typeof(PropertyInfoAttribute));

// And, finally, check if attribute is existing
// ... And so, assertion passes - attribute is existing
Trace.Assert(!Object.ReferenceEquals(null, at), "No Attribute found.");
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top