[英]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
)。 可以從用法中推斷出T
和TProperty
,但是需要指定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.