根据值确定常量的名称
有没有办法从给定值确定常量的名称?
例如,给出以下内容:
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; }
最简单的方法是切换到使用枚举
我认为你不能以确定的方式做到这一点。 如果有多个常量具有相同的值,该怎么办?