【问题标题】:Get overridden property attribute获取覆盖的属性属性
【发布时间】:2014-01-17 01:53:01
【问题描述】:

我有一个这样的自定义属性:

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

还有这样一个类:

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

在另一个继承自 Article 的类中,我重写 Order 属性并为其声明属性,如下所示:

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

当我想通过 PropertyInfo 类中的 GetCustomAttributes 方法获取属性时出现问题。我是这样做的:

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

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

但它什么也没返回!不知道为什么!

更新:

我通过这种方法获取属性信息:

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

【问题讨论】:

  • 能否附上获取propInfo的代码?您需要从 Order 属性而不是 ArticleDetails 类本身获取信息。
  • @GaneshSittampalam 我已经更新了,谢谢
  • 我认为您需要将其缩减为直接获取属性的内容。我怀疑您上面的代码最终会有所不同。

标签: c# inheritance overriding custom-attributes system.reflection


【解决方案1】:

我认为问题隐藏在这里:

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

我认为您实际上是从 Article 类而不是 ArticleDetails 获取此属性信息,这就是它返回 null 的原因。以下 sn-p 按预期工作:

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

更新


根据您的更新-问题是MemberExpressionMember 属性指向Article 类型;

作为解决方案,您可以按如下方式更新您的InitPropertyInforAttribute

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

并且不要忘记您应该将 ArticleDetails 作为第一个泛型类型参数传递 - InitPropertyInfoAttribute&lt;ArticleDetails, propertyType&gt;

【讨论】:

  • 是的,这是因为获取属性信息,但正如您在我的更新中看到的那样,我尝试从表达式方法获取属性信息。我怎样才能获得像你这样的房产信息?谢谢:)
【解决方案2】:

抱歉,我无法重现该错误。属性被提取。能否提供详细信息?

// 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.");

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多