根据值确定常量的名称

时间:2009-06-30 15:07:33

标签: c# .net reflection const

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

例如,给出以下内容:

public const uint ERR_OK = 0x00000000;

如何获得“ERR_OK”?

我一直在寻找反思,但似乎找不到任何可以帮助我的事情。

7 个答案:

答案 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)

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