gpt4 book ai didi

c# - 从对象中获取自定义属性

转载 作者:太空狗 更新时间:2023-10-30 00:05:33 28 4
gpt4 key购买 nike

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

最佳答案

您正在向该方法传递一个字符串“不重要”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");

(并从那里进行反射(reflection))- 或与泛型混合(无缘无故):

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

关于c# - 从对象中获取自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10879773/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com