【问题标题】:How to get a constant's name given its value如何在给定值的情况下获取常量的名称
【发布时间】:2014-08-20 05:42:39
【问题描述】:

固件制造商时不时地发布一个 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”?

【问题讨论】:

  • 我很确定唯一的方法是使用反射,枚举该类中的所有常量并检查哪一个具有给定值。最好使用enum 而不是类/常量。

标签: c#


【解决方案1】:

使用反射保持简单:

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

【讨论】:

  • 我已经实现了这个,但还没有机会验证它是否能 100% 工作。
  • 如果你想快速验证这一点,只需打开一个新项目,复制制造商类并粘贴它..
【解决方案2】:

你可以这样尝试:

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#: Using Reflection to get constant values

【讨论】:

    【解决方案3】:

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

    然后你就可以用你所拥有的值来使用那个枚举。

    【讨论】:

    • OP提到制造商API,可能他对现有代码无能为力。
    • @YuliamChandra 真假。就像他可以加载和使用反射一样,他可以创建枚举。
    • 如果这是可自动化的,它可能是一个选项。我考虑过使用某种代码生成工具从类中生成一个枚举。我先试试反射建议。
    • 是什么阻止了您实现自动化? :) 。我没有反对反射,因为我的原始信息是..另一个选项... :)
    【解决方案4】:

    一个好的解决方案是将 Amir Popovich 和 Marcin Juraszek 建议通过代码检索常量值-名称关系的反射选项与 Noctis 建议自动构建一个枚举相结合。

    如果这不是经常更改的代码(我理解就是这种情况),那么动态构建值名称字典并在运行时访问它比静态创建枚举并将其包含在您的项目中具有更多的开销。

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

    【讨论】:

    • 我喜欢这个建议。然而,在这种情况下,性能并不重要,因为对文件进行的其余处理比确定制造商名称要密集得多。
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多