Get name of Enum instance
假设我有这个枚举:
1 2 3 4 5
| public enum MyEnum{
ValueOne = 1,
ValueTwo = 2,
ValueThree = 3
} |
然后这个字段/变量:
1
| public MyEnum myEnumInstance = MyEnum.ValueTwo; |
我需要通过另一个类的反射得到EDOCX1的name。
我试过:
1
| myClassInstance.GetType().GetField("myEnumInstance").GetValue(myClassInstance) |
它总是返回ValueOne,不管myEnumInstance设置为什么。
如何通过反射获取枚举字段的字符串值/名称?
- 值中的枚举字符串名称可能重复
- @FiringSquadwitness不是重复的,我的问题完全不同。我很难从价值入手
- 我还不清楚你为什么需要反思…为什么不是myClassInstance.myEnumInstance.ToString()?
- @Jason很难解释,但基本上我有一个库存系统,针对不同类型的物品有几个不同的类别。我正在制作一个编辑器来显示所有ITME不同类的字段。因为我将它编程为通用的,并且没有任何特定于类的代码,所以我需要使用反射来访问字段。我的系统除了Enums以外什么都能用。
- @Keithm逐字运行代码确实会生成ValueTwo。几乎可以肯定的是,因为您选择了错误的字段,或者myEnumInstance没有设置为您认为的值。
- 不知道你到底在找什么,但是你可以从Enum、Enum.GetValues(typeof(MyEnum))、Enum.GetNames(typeof(myEnum))和typeof(myEnum).ToString()那里得到一切。
- @罗布,这很奇怪,我已经在这工作了一个小时了,当我知道它设置的不同时,它仍然返回错误的值。这可能与我工作的环境有关,我会努力找出是否是这种情况。
- @基思看到这个小提琴-它产生了你想要的结果。我倾向于投票来结束这个无法复制的问题,因为问题似乎真的存在于某个与问题完全无关的地方。
- 为了测试,我把反射代码和myEnumInstance.ToString()放在一起,然后打印出来,反射返回了错误的值,.ToString()返回了正确的值。这里发生了一些奇怪的事情,看起来与思考无关,与问题无关,所以我将结束它。
- 您使用的反射代码是什么?它可能返回枚举中的第一个值,而不是实例设置为的值。
- 当然,我只是意识到我把我班上的错误实例传递给了反思。我没有传递修改过的实例,而是传递了一个尚未填充的实例。他们都有相似的域名,所以我完全错过了
- 鲁塔的案子?;)
你不需要反思。你只需要打电话给.ToString()。
1
| myEnumInstance.ToString(); |
输出"ValueTwo";
但是,如果您坚持使用反射,那么下面的示例工作得很好:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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来表示某些强类型的语法结构:
1 2 3
| myClassInstance .GetType()
.GetField(nameof(myEnumInstance ))
.GetValue(myClassInstance ); |
如果您仍然无法访问该字段,那是因为它不像示例代码中描述的那样是公共的,在示例代码中您需要传递适当的绑定标志。
1 2 3 4 5
| myClassInstance
.GetType()
.GetField(nameof(myEnumInstance ),
BindingFlags .NonPublic | BindingFlags .GetField | BindingFlags .Instance)
.GetValue(myClassInstance ); |
- 我编辑了这个问题,补充说我正在从另一个类访问这个问题。我这样做需要反思。相信我,如果这么简单的话,我会做的。
- 即使进行了编辑,您仍然可以调用myClassInstance.myEnumInstance.ToString()?
- @根据您的编辑,keithm nstuke应该是正确的。你还是可以打电话给.ToString()。