【问题标题】:Get name of Enum instance [closed]获取枚举实例的名称 [关闭]
【发布时间】:2016-08-12 10:02:14
【问题描述】:

假设我有这个枚举:

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

然后是这个字段/变量:

public MyEnum myEnumInstance = MyEnum.ValueTwo;

我需要通过反射从另一个类获取myEnumInstancename

我试过了:

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

无论myEnumInstance 设置为什么,它总是返回ValueOne

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

【问题讨论】:

  • @FiringSquadWitness 不,不是重复的,我的问题完全不同。我无法从一开始就获得价值
  • 我仍然不清楚你为什么需要反思......为什么不myClassInstance.myEnumInstance.ToString()
  • @JasonP 很难解释,但基本上我有一个库存系统,其中包含针对不同类型物品的几个不同类别。我正在制作一个编辑器来显示所有 itme 不同类的字段。由于我将其编程为通用且没有任何特定于类的代码,因此我需要使用反射来访问字段。我的系统适用于除枚举之外的所有内容。
  • @KeithM 请参阅this fiddle - 它会产生您想要的结果。我倾向于投票关闭它,因为它无法复制,因为看起来问题确实存在于与问题完全无关的某个地方

标签: c# reflection enums


【解决方案1】:

你不需要反思。您只需致电.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);

【讨论】:

  • 我编辑了问题以添加我正在从另一个类访问它。我这样做的方式需要反思。相信我,如果就这么简单,我会做myEnumInstance.ToString(); :)
  • 即使进行了编辑,您应该仍然可以致电myClassInstance.myEnumInstance.ToString()
  • @KeithM NStuke 根据您的编辑应该是正确的。您仍然可以拨打.ToString()
猜你喜欢
  • 2018-06-24
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
相关资源
最近更新 更多