说我有以下声明:
public enum Complexity { Low = 0, Normal = 1, Medium = 2, High = 3 }
public enum Priority { Normal = 1, Medium = 2, High = 3, Urgent = 4 }
我希望对它进行编码,这样我就可以获得枚举值(而不是索引,就像我之前提到的那样):
//should store the value of the Complexity enum member Normal, which is 1
int complexityValueToStore = EnumHelper.GetEnumMemberValue(Complexity.Normal);
//should store the value 4
int priorityValueToStore = EnumHelper.GetEnumMemberValue(Priority.Urgent);
这个可重用的功能应该如何?
TIA! -ren
答案 0 :(得分:15)
修改后的答案(问题澄清后)
不,没有什么比演员更干净了。它比方法调用,更便宜,更短等更具信息性。它的影响力与你可能希望的一样低。
请注意,如果您想编写一个通用方法来进行转换,您还必须指定要将其转换为的内容:枚举可以基于byte
或long
例。通过投入演员,你明确地说出你想要把它转换成什么,它只是做到了。
原始回答
“指数”究竟是什么意思?你的意思是数值吗?刚刚转为int
。如果你的意思是“在枚举中的位置”,你必须确保这些值是按数字顺序排列的(因为Enum.GetValues
给出的是 - 而不是声明顺序),然后执行:
public static int GetEnumMemberIndex<T>(T element)
where T : struct
{
T[] values = (T[]) Enum.GetValues(typeof(T));
return Array.IndexOf(values, element);
}
答案 1 :(得分:8)
您可以通过强制转换来找到枚举的整数值:
int complexityValueToStore = (int)Complexity.Normal;
答案 2 :(得分:4)
我所知道的最通用的方法是使用反射读取value__
字段。
这种方法不会对枚举的基础类型做出任何假设,因此它将适用于不基于Int32
的枚举。
public static object GetValue(Enum e)
{
return e.GetType().GetField("value__").GetValue(e);
}
Debug.Assert(Equals(GetValue(DayOfWeek.Wednesday), 3)); //Int32
Debug.Assert(Equals(GetValue(AceFlags.InheritOnly), (byte) 8)); //Byte
Debug.Assert(Equals(GetValue(IOControlCode.ReceiveAll), 2550136833L)); //Int64
注意:我只使用Microsoft C#编译器对此进行了测试。遗憾的是,这似乎没有内置的方法。
答案 3 :(得分:2)
我意识到这不是你提出的问题,但这是你可能会欣赏的事情。
如果您知道枚举的最小值是什么,我发现您可以找到没有强制转换的枚举的整数值:
public enum Complexity { Low = 0, Normal = 1, Medium = 2, High = 3 }
int valueOfHigh = Complexity.High - Complexity.Low;
这不适用于优先级,除非您添加了一些最小值0或添加了1:
public enum Priority { Normal = 1, Medium = 2, High = 3, Urgent = 4 }
int valueOfUrgent = Priority.Urgent - Priority.Normal + 1;
我觉得这种技术比投射到int更具美学吸引力。
我不确定如果你有一个基于字节或长的枚举会发生什么 - 我怀疑你会得到字节或长差值。
答案 4 :(得分:0)
如果你想要这个值,你可以将枚举转换成int。这将设置complexityValueToStore == 1和priorityValueToStore == 4.
如果你想获得索引(即:Priority.Urgent == 3),你可以使用Enum.GetValues,然后在该列表中找到当前枚举的索引。但是,返回列表中枚举的顺序可能与您的代码中的顺序不同。
然而,第二种选择首先打败了Enum的目的 - 你试图拥有离散值而不是列表和索引。如果那就是你想要的,我会重新考虑你的需求。
答案 5 :(得分:0)
这是解决问题的最简单方法:
public static void GetEnumMemberValue<T>(T enumItem) where T : struct
{
return (int) Enum.Parse(typeof(T), enumItem.ToString());
}
它对我有用。