[英]Retrieve name and value of property has a specific attribute value
假设有一个属性,例如:
public class ValueAttribute : Attribute
{
public int Val;
public ValueAttribute(int val)
{
Val = val;
}
}
它适用于 class:
public class Person
{
[Value(10)]
public string FirstName;
[Value(20)]
public string LastName;
[Value(30)]
public string Age;
}
我将如何 go 关于有效检索具有Value(20)
的属性的第一次出现的PropertyInfo
(最好没有循环/迭代)?
首先,你有字段而不是属性,所以如果有什么需要从FieldInfo
object 获取属性。 其次,如果没有某种形式的迭代,就没有办法做你想做的事。 如果您担心每次都必须查找它,您可以缓存每种类型的结果。
public static class ValueHelper<T>
{
private static readonly Dictionary<int, FieldInfo> FieldsByValue;
static ValueHelper()
{
FieldsByValue = typeof(T)
.GetFields()
.Select(f => new {
Field = f,
Att = f.GetCustomAttribute<ValueAttribute>()
})
.Where(c => c.Att != null)
.GroupBy(c => c.Att.Val, (val, flds) => new {
Value = val,
Field = flds.First()
})
.ToDictionary(c => c.Value, c => c.Field);
}
public static FieldInfo GetFieldByValue(int value)
{
if (FieldsByValue.TryGetValue(value, out var field))
return field;
// not found, return null...
// throw exception, etc
return null;
}
}
然后可以像这样使用它:
var field = ValueHelper<Person>.GetFieldByValue(20);
反射只发生一次(感谢 static 构造函数),然后缓存在查找表中以供进一步访问。
如果您确实有属性,则将FieldInfo
替换为PropertyInfo
,将GetFields
替换为GetProperties
。
注意:我不确定从反射返回的字段/属性的顺序是否得到保证。 它们可能是按源顺序返回的,但这很可能是一个实现细节。
您可以使用以下代码
var attr = (ValueAttribute)(typeof(Person)
.GetField("FirstName")
.GetCustomAttributes(false)
.GetValue(0));
Console.WriteLine(attr.Val);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.