获取Enum实例的名称

时间:2016-04-20 00:22:21

标签: c# reflection enums

说我有这个枚举:

public enum MyEnum{
    ValueOne = 1,
    ValueTwo = 2,
    ValueThree = 3
}

然后是这个字段/变量:

public MyEnum myEnumInstance = MyEnum.ValueTwo;

我需要通过来自其他类的反射获取name myEnumInstance

我试过了:

myClassInstance.GetType().GetField("myEnumInstance").GetValue(myClassInstance)

无论ValueOne设置为何,都始终返回myEnumInstance

如何通过反射获取枚举字段的字符串值/名称?

1 个答案:

答案 0 :(得分:3)

你不需要反思。您只需致电.ToString()

myEnumInstance.ToString();

将输出"ValueTwo";

但是,如果您坚持使用反射,以下示例可以正常工作:

var myClassInstance = new MyClass();
myClassInstance.GetType()
               .GetField("myEnumInstance")
               .GetValue(myClassInstance);

public enum MyEnum
{
    ValueOne = 1,
    ValueTwo = 2,
    ValueThree = 3
}

public class MyClass
{
    public MyEnum myEnumInstance = MyEnum.ValueTwo;
}

请注意,在C#6中,您还可以使用nameof来表示一些强类型的句法糖:

myClassInstance.GetType()
               .GetField(nameof(myEnumInstance))
               .GetValue(myClassInstance);

如果您仍然无法访问该字段,那是因为它不是公共的,如示例代码中所述,您需要传入适当的绑定标记。

myClassInstance
    .GetType()
    .GetField(nameof(myEnumInstance), 
        BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance)
    .GetValue(myClassInstance);