c# - 使用扩展方法访问字段的属性

标签 c# linq extension-methods custom-attributes

我想使用扩展方法检查类成员(仅限字段)的自定义属性。

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 methodGetAttribute 功能相同上面定义的方法,如果可用的话应该使用它。

关于c# - 使用扩展方法访问字段的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608425/

相关文章:

c# - 1000000000 * 3 = -1294967296?

c# - PDF锐利水印

linq - Sitecore 搜索 : Get results term by term

c# - 将值存储在字典中或从连接的键中检索

c# - 在 linq 查询中设置和使用值

ios - Swift 3 扩展返回 "has no member"错误

c# - 如何使用 EntityFramework.BulkInsert?

c# - 我应该只捕获异常以记录它们吗?

C#无法匹配Html特殊字符

css - KendoUI Column Center 自定义MVC扩展方法