C# 获取枚举实例的名称

C# 获取枚举实例的名称,c#,reflection,enums,C#,Reflection,Enums,假设我有这个枚举: public enum MyEnum{ ValueOne = 1, ValueTwo = 2, ValueThree = 3 } 然后这个字段/变量: public MyEnum myEnumInstance = MyEnum.ValueTwo; 我需要通过反射从另一个类获得myEnumInstance的名称 我试过: myClassInstance.GetType().GetField("myEnumInstance").GetValue(myC

假设我有这个枚举:

public enum MyEnum{
    ValueOne = 1,
    ValueTwo = 2,
    ValueThree = 3
}
然后这个字段/变量:

public MyEnum myEnumInstance = MyEnum.ValueTwo;
我需要通过反射从另一个类获得
myEnumInstance
名称

我试过:

myClassInstance.GetType().GetField("myEnumInstance").GetValue(myClassInstance)
它总是返回
ValueOne
,无论
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);

@FiringSquadWitness可能重复不,不是重复,我的问题完全不同。我很难从一开始就得到这个值我还不清楚为什么你需要反思。。。为什么不
myClassInstance.myEnumInstance.ToString()
?@JasonP很难解释,但基本上我有一个库存系统,它有几个不同的类,用于不同类型的项目。我正在制作一个编辑器来显示所有itme不同类的字段。因为我将它编程为泛型,并且没有任何特定于类的代码,所以我需要使用反射来访问字段。我的系统可以处理除枚举以外的所有内容。@Keith请看-它会生成您想要的结果。我倾向于投票结束这篇文章,因为它无法复制,因为问题似乎真的存在于某个与问题完全无关的地方。我编辑了这个问题,补充说我是从另一个类访问这个问题的。我这样做需要反思。相信我,我会做
myEnumInstance.ToString()如果是这么简单:)您应该仍然能够调用
myClassInstance.myEnumInstance.ToString()
即使您进行了编辑?@Keith NStuke根据您的编辑应该是正确的。您仍然可以调用
.ToString()
myClassInstance
    .GetType()
    .GetField(nameof(myEnumInstance), 
        BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance)
    .GetValue(myClassInstance);