从对象获取自定义属性

本文关键字:自定义属性 获取 对象 | 更新日期: 2023-09-27 18:36:08

当我尝试从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);
    }
}

从对象获取自定义属性

你正在传递一个string"not important"到该方法。因此,Typetypeof(string)。它没有这些属性。此外,即使Person也没有这个属性:只有MemberInfoFirstName)才有它们。

有一些方法可以通过传递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);
}

var attrs = AttributeReader.Read(() => FirstName);

然而!我应该建议我不确定 Person 构造函数是否适合这样做。可能需要缓存。

如果您不想使用 lambda,那么传递Type和成员名称也可以,即

var attrs = AttributeReader.Read(typeof(Person), "FirstName");

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

var attrs = Attribute.Read<Person>("FirstName");