从对象获取自定义属性

moo*_*per 4 c# reflection attributes custom-attributes

当我尝试从object函数返回时获取自定义属性null.为什么?

class Person
{
    [ColumnName("first_name")]
    string FirstName { get; set; }

    Person()
    {
        FirstName = "not important";
        var attrs = AttributeReader.Read(FirstName);
    }
}

static class AttributeReader
{
    static object[] Read(object column)
    {
        return column.GetType().GetCustomAttributes(typeof(ColumnNameAttribute), false);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 14

你传递一个string,"not important"该方法.该Type因此typeof(string).哪个没有这些属性.此外,甚至Person没有该属性:只有MemberInfo(FirstName)具有它们.

通过以下方式可以做到这一点Expression:

public static ColumnNameAttribute[] Read<T>(Expression<Func<T>> func)
{
    var member = func.Body as MemberExpression;
    if(member == null) throw new ArgumentException(
         "Lambda must resolve to a member");
    return (ColumnNameAttribute[])Attribute.GetCustomAttributes(
         member.Member, typeof(ColumnNameAttribute), false);
}
Run Code Online (Sandbox Code Playgroud)

var attrs = AttributeReader.Read(() => FirstName);
Run Code Online (Sandbox Code Playgroud)

然而!我应该告诉我,我不确定Person构造函数是否适合这个.可能需要缓存.

如果你不想使用lambdas,那么传递a Type和成员名也可以,即

var attrs = AttributeReader.Read(typeof(Person), "FirstName");
Run Code Online (Sandbox Code Playgroud)

(并从那里做反思) - 或与泛型混合(没有真正的原因):

var attrs = Attribute.Read<Person>("FirstName");
Run Code Online (Sandbox Code Playgroud)