我想通过使用扩展方法检查我的类成员(仅字段)上的自定义属性。使用扩展方法在字段上访问属性
public class DatabaseIdAttribute : Attribute
{
public int ID { get; set; }
public DatabaseIdAttribute(int id)
{
this.ID = id;
}
}
public class MyClass
{
[DatabaseId(1)]
double Height {get;set;}
[DatabaseId(2)]
double Width {get;set;}
double Area { get { return this.Height * this.Width; }
}
我想在扩展方法中使用LINQ表达式来访问类字段,而不是传递魔术字符串。
var myClass = new MyClass();
var attribute = myClass.GetAttribute<DatabaseIdAttribute>(c => c.Height);
是否有可能实现?
[编辑]
暂且,我已经实现了与@leppie
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 member) where T : Attribute
{
return member.GetCustomAttributes(false).OfType<T>().SingleOrDefault();
}
这使得获取属性以下列方式
var c = new MyClass();
var attribute = c.GetMember(m => m.Height).GetAttribute<DatabaseIdAttribute>();
的帮助下
但我希望能够通过以下方式访问它:
var c = new MyClass();
var attribute = c.GetAttribute<DatabaseIdAttribute>(m => m.Height);
是的,这是可能的,微不足道的。你有什么尝试? – leppie 2013-03-25 05:49:16
是的,它看起来微不足道,但我无法找到一个例子。这就是我在这里问的原因。 – 2013-03-25 06:06:31
不要使用'object',否则会涉及转换。使用一个额外的通用参数(即'R')。此外,该成员也可以是一个'PropertyInfo'(在这种情况下)。如果你只对属性感兴趣,'MemberInfo'可能就足够了。 – leppie 2013-03-25 06:08:23