从对象获取自定义属性
本文关键字:自定义属性 获取 对象 | 更新日期: 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"
到该方法。因此,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);
}
跟
var attrs = AttributeReader.Read(() => FirstName);
然而!我应该建议我不确定 Person
构造函数是否适合这样做。可能需要缓存。
如果您不想使用 lambda,那么传递Type
和成员名称也可以,即
var attrs = AttributeReader.Read(typeof(Person), "FirstName");
(并从那里进行反思) - 或与泛型混合(没有真正的原因):
var attrs = Attribute.Read<Person>("FirstName");