当我尝试从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);
}
}
答案 0 :(得分: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);
}
与
var attrs = AttributeReader.Read(() => FirstName);
然而!我应该告诉我,我不确定Person
构造函数是否适合这个。可能需要缓存。
如果您不想使用lambdas,那么传递Type
和成员名也可以,即
var attrs = AttributeReader.Read(typeof(Person), "FirstName");
(并从那里做反思) - 或与泛型混合(没有实际原因):
var attrs = Attribute.Read<Person>("FirstName");