簡體   English   中英

從對象獲取屬性

[英]Get Attribute from object

我希望得到一個特定的Attribute一個對象的屬性之一。

我使用此代碼作為入門

public static class ObjectExtensions {
  public static MemberInfo GetMember<T,R>(this T instance, 
    Expression<Func<T, R>> selector) {
      var member = selector.Body as MemberExpression;
      if (member != null) {
        return member.Member;
      }
      return null;
  }

public static T GetAttribute<T>(this MemberInfo meminfo) where T : Attribute {
  return meminfo.GetCustomAttributes(typeof(T)).FirstOrDefault() as T;
  }
}

然后您這樣稱呼它:

var attr = someobject.GetMember(x => x.Height).GetAttribute<FooAttribute>();

但我希望像這樣干凈的一步:

var attr = someobject.GetAttribute<FooAttribute>(x => x.Height);

我如何結合這兩個功能來賦予此簽名?

更新:另外,為什么這對於枚舉不起作用?

您將無法獲得確切的簽名。 為了使該方法起作用,它需要三個泛型類型參數(一個用於對象類型T ,一個用於屬性類型TAttribute ,一個用於屬性類型TProperty )。 可以從用法中推斷出TTProperty ,但是需要指定TAttribute 不幸的是,一旦指定了一個泛型類型參數,就需要同時指定所有三個參數。

public static class ObjectExtensions {
    public static TAttribute GetAttribute<T, TAttribute, TProperty> (this T instance, 
        Expression<Func<T, TProperty>> selector) where TAttribute : Attribute {
        var member = selector.Body as MemberExpression;
        if (member != null) {
            return member.Member.GetCustomAttributes(typeof(TAttribute)).FirstOrDefault() as TAttribute;
        }
        return null;
    }
}   

這就是為什么問題中的兩種方法要分開開始的原因。 寫起來比較容易

var attr = someobject.GetMember(x => x.Height).GetAttribute<FooAttribute>();

比寫

var attr = someobject.GetAttribute<Foo, FooAttribute, FooProperty>(x => x.Height);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM