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)
归档时间: |
|
查看次数: |
11591 次 |
最近记录: |