如何根据其价值获得一个恒定的名称

时间:2014-08-20 05:42:39

标签: c#

固件制造商不时提供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”文本?

4 个答案:

答案 0 :(得分:5)

使用反射保持简单:

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

答案 1 :(得分: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

答案 2 :(得分:1)

一个选项可能是编写一个脚本,将该类作为参数,并创建一个Enum类。 (所以基本上,将类标题更改为枚举,在公司名称之前删除垃圾,并将;更改为,,除了最后一个。

然后你可以使用你拥有的值枚举。

答案 3 :(得分:0)

一个很好的解决方案是结合Amir Popovich和Marcin Juraszek建议的反射选项,通过代码检索恒定的价值 - 名称关系,与Noctis&#39;建议自动构建一个Enum。

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

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