如何获得给定值的常量的名称

本文关键字:常量 何获得 | 更新日期: 2023-09-27 18:18:57

固件制造商偶尔会发布一个API,其中包含这样的类:

public static class Manufacturer 
{
  public const ushort FooInc = 1;
  public const ushort BarInc = 2;
  public const ushort BigCompany = 3;
  public const ushort SmallCompany = 4;
  public const ushort Innocom = 5;
  public const ushort Exocomm = 6;
  public const ushort Quarqian = 7;
  // snip... you get the idea
}

我无法控制这个类,而且可能会不时出现一个新的类,所以我真的不想重写它。

在我的代码中,我可以从数据文件中访问一个整数,该整数表示该文件来自的设备的"制造商"。

如果可能的话,我希望在我的UI上显示制造商的名称,而不是编号,但我能找到的唯一交叉参考是这个类。

所以,假设我从文件中得到数字"6",我如何将其转换为文本"Exocomm"?

如何获得给定值的常量的名称

使用反射保持简单:

   var props = typeof(Manufacturer).GetFields(BindingFlags.Public | BindingFlags.Static);
   var wantedProp = props.FirstOrDefault(prop => (ushort)prop.GetValue(null) == 6);

您可以这样尝试:

public string FindName<T>(Type type, T value)
{
    EqualityComparer<T> c = EqualityComparer<T>.Default;
    foreach (FieldInfo  f in type.GetFields
             (BindingFlags.Static | BindingFlags.Public))
    {
        if (f.FieldType == typeof(T) &&
            c.Equals(value, (T) f.GetValue(null)))
        {
            return f.Name; 
        }
    }
    return null;
}

也检查 c#:使用反射来获取常量

一种选择可能是编写一个脚本,将该类作为参数,并创建一个Enum类。(所以基本上,将类头改为enum,砍掉公司名称之前的废话,并将;更改为,,但最后一个。

一个好的解决方案是结合反射选项,阿米尔波波维奇和Marcin Juraszek建议通过代码检索常量值-名称关系,与Noctis的建议建立一个Enum自动出来。

如果这不是经常变化的代码(我理解是这种情况),而不是动态地构建一个值-名字典并在运行时访问它,比静态地创建一个enum并将其包含在项目中有更多的开销。

将其添加为构建步骤,并将处理时间移动到编译器,而不是运行时。