有没有办法从给定值确定常量的名称?
例如,给出以下内容:
public const uint ERR_OK = 0x00000000;
如何获得“ERR_OK”?
我一直在寻找反思,但似乎找不到任何可以帮助我的事情。
答案 0 :(得分:15)
一般情况下,你不能。可以有任意数量的具有相同值的常量。如果您知道声明常量的类,您可以查找所有公共静态字段并查看是否有值为0,但这就是全部。那么,这对你来说可能还不错 - 是吗?如果是的话......
public string FindConstantName<T>(Type containingType, T value)
{
EqualityComparer<T> comparer = EqualityComparer<T>.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
}
答案 1 :(得分:3)
您可能会对Enums感兴趣,可以通过编程方式将其从名称转换为值,反之亦然。
答案 2 :(得分:3)
我可能会迟到..但我认为以下可能是答案
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 "";
}
}
以下将打印&#34; name1 &#34;
string result = Names.GetNames("Name 01");
Console.WriteLine(result )
答案 3 :(得分:2)
您将无法执行此操作,因为常量在编译时将替换为其文字值。
换句话说,编译器采用了这个:
class Foo
{
uint someField = ERR_OK;
}
并将其变为:
class Foo
{
uint someField = 0;
}
答案 4 :(得分:1)
我建议你使用枚举代表你的常数。
或者
string ReturnConstant(uint val)
{
if(val == 0x00000000)
return "ERR_OK";
else
return null;
}
答案 5 :(得分:1)
最简单的方法是切换到使用枚举
答案 6 :(得分:0)
我认为你不能以确定的方式做到这一点。如果有多个常量具有相同的值会怎样?