c#enum reflection,多个名字时获取名称

时间:2012-08-07 18:10:09

标签: c# reflection enums

考虑以下

public enum E
{
  A = 1,
  B = 1  
}

public string F(E input)
{
 return input.ToString();
}

F(E.B); //returns "A"

现在我知道您不应该((E)1).ToString(),因为它可以解析为ABhttp://msdn.microsoft.com/en-us/library/16c1xs4z.aspx)。
但是,如果它是明确选择的值(例如B),为什么ToString()表现得很糟糕(返回A)?

调试可能会发现inputB时,是否可以在代码中获取所选字段?

修改
这个问题与调试器如何知道哪个值传递给F()有关,而在代码中似乎无法检测到这个值?

2 个答案:

答案 0 :(得分:2)

枚举实际上只是一个整数值。当您拨打input.ToString()时,枚举会执行以下操作:

  • 获取输入值,在本例中为1
  • 将此传递给内部格式化例程,该例程找到匹配的名称(如果未使用[Flags]进行修饰)
  • 返回名称

当找到匹配的名称时,它会找到值为1的第一个匹配项,在本例中为E.A,并打印“A”。

通常,这不是问题,因为通常每个名称只有一个枚举值。

  

当调试它可能看到输入是B时,是否可以在代码中获取所选字段?

问题是input不是“B” - 输入值为1包含在E变量中,这意味着输入为E.A 和< / strong> E.B

要演示,请运行:

using System;
class Program
{
    public enum E
    {
        A = 1,
        B = 1
    }

    static void Main(string[] args)
    {
        E value = E.B;


        Console.WriteLine(value == E.B);
        Console.WriteLine(value == E.A);

        Console.ReadKey();
    }

}

这将打印True两次,因为value同时为E.AE.B

如果您暂停Console.ReadKey,调试器也会将value显示为“A”。

答案 1 :(得分:0)

问题是两个可能的枚举值AB都有1的整数值,因此无法区分A和{ {1}}因为C#只是将B的值作为参数传递给方法。