繁体   English   中英

检索属性的名称和值具有特定的属性值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM