根据值确定常量的名称

有没有办法从给定值确定常量的名称?

例如,给出以下内容:

public const uint ERR_OK = 0x00000000;

如何获得“ERR_OK”?

我一直在寻找反思,但似乎无法找到任何有助于我的东西。

一般来说,你不能。 可以有任意数量的具有相同值的常量。 如果您知道声明常量的类,您可以查找所有公共静态字段并查看是否有值为0,但这就是全部。 那么,这对你来说可能还不错 – 是吗? 如果是这样…

public string FindConstantName(Type containingType, T value) { EqualityComparer comparer = EqualityComparer.Default; foreach (FieldInfo field in containingType.GetFields (BindingFlags.Static | BindingFlags.Public)) { if (field.FieldType == typeof(T) && comparer.Equals(value, (T) field.GetValue(null))) { return field.Name; // There could be others, of course... } } return null; // Or throw an exception } 

您可能对Enums感兴趣,可以通过编程方式从名称转换为值,反之亦然。

我可能会迟到..但我认为以下可能是答案

 public static class Names { public const string name1 = "Name 01"; public const string name2 = "Name 02"; public static string GetNames(string code) { foreach (var field in typeof(Names).GetFields()) { if ((string)field.GetValue(null) == code) return field.Name.ToString(); } return ""; } } 

以下将打印“ name1

 string result = Names.GetNames("Name 01"); Console.WriteLine(result ) 

您将无法执行此操作,因为常量在编译时将替换为其文字值。

换句话说,编译器采用这个:

 class Foo { uint someField = ERR_OK; } 

把它变成这个:

 class Foo { uint someField = 0; } 

我建议你使用枚举代表你的常数。

要么

 string ReturnConstant(uint val) { if(val == 0x00000000) return "ERR_OK"; else return null; } 

最简单的方法是切换到使用枚举

我认为你不能以确定的方式做到这一点。 如果有多个常量具有相同的值,该怎么办?