从对象获取属性
本文关键字:属性 获取 对象 | 更新日期: 2023-09-27 18:26:55
我想在对象的一个属性上获得一个特定的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);