获取枚举实例的名称

Kei*_*h M 3 c# reflection enums

说我有这个枚举:

public enum MyEnum{
    ValueOne = 1,
    ValueTwo = 2,
    ValueThree = 3
}
Run Code Online (Sandbox Code Playgroud)

然后这个字段/变量:

public MyEnum myEnumInstance = MyEnum.ValueTwo;
Run Code Online (Sandbox Code Playgroud)

我需要得到name的myEnumInstance通过反射从另一个类。

我试过:

myClassInstance.GetType().GetField("myEnumInstance").GetValue(myClassInstance)
Run Code Online (Sandbox Code Playgroud)

ValueOne无论myEnumInstance设置为什么,它始终返回。

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

Dav*_*d L 7

你不需要反思。你只需要调用.ToString().

myEnumInstance.ToString();
Run Code Online (Sandbox Code Playgroud)

这将输出"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;
}
Run Code Online (Sandbox Code Playgroud)

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

myClassInstance.GetType()
               .GetField(nameof(myEnumInstance))
               .GetValue(myClassInstance);
Run Code Online (Sandbox Code Playgroud)

如果您仍然无法访问该字段,那是因为它不像您的示例代码中描述的那样公开,您需要在其中传递适当的绑定标志。

myClassInstance
    .GetType()
    .GetField(nameof(myEnumInstance), 
        BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance)
    .GetValue(myClassInstance);
Run Code Online (Sandbox Code Playgroud)

  • 即使进行了编辑,您仍然应该能够调用`myClassInstance.myEnumInstance.ToString()`吗? (2认同)