我想使用扩展方法检查类成员(仅限字段)的自定义属性。
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);
最佳答案
你快到了!这应该有效(未经测试)。
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;
}
// unnecessary in .NET 4.5 and up, see note!
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<DatabaseIdAttribute>();
注意:从 .NET 4.5 及更高版本(包括 .NET Core)开始,BCL 提供了一个 GetCustomAttribute<T>(MemberInfo)
extension method与 GetAttribute
功能相同上面定义的方法,如果可用的话应该使用它。
关于c# - 使用扩展方法访问字段的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608425/