我有一个名为 Questions
(复数)的类 . 在这个类中有一个名为 Question
(单数)的枚举,看起来像这样 .
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
在 Questions
类中,我有一个 get(int foo)
函数,它为 foo
返回一个 Questions
对象 . 有没有一种简单的方法从枚举中获取整数值,所以我可以做 Questions.Get(Question.Role)
这样的事情?
25 回答
它比你想象的容易 - 枚举已经是一个整数 . 它只需要提醒:
例:
并在后面的代码中获取枚举值:
要么
枚举将增加1,您可以设置起始值 . 如果未设置起始值,则最初将其指定为0 .
我最近在代码中转而使用枚举,转而使用带有受保护构造函数和预定义静态实例的类(感谢Roelof - C# Ensure Valid Enum Values - Futureproof Method) .
鉴于此,现在在's how I'下方处理此问题(包括隐式转换为/来自
int
) .这种方法的优点是你可以从枚举中获得所有内容,但是你的代码现在更加灵活,所以如果你需要根据
Question
的值执行不同的操作,你可以将逻辑放入Question
本身(即首选OO方式)而不是在整个代码中放置大量case语句来处理每个场景 .注意:答案更新2018-04-27以利用C#6功能;即声明表达式和lambda表达式主体定义 . 有关原始代码,请参阅revision history . 这样做的好处是使定义不那么冗长;这是对这个答案方法的主要抱怨之一 .
number
应该具有值2
.......是一个很好的宣言 .
你必须像这样将结果转换为int:
否则,类型仍然是
QuestionType
.这种严格程度是C#方式 .
一种替代方法是使用类声明:
声明它不太优雅,但你不需要在代码中强制转换它:
或者,您可能会对Visual Basic感到更舒服,因为Visual Basic可以满足许多领域的这种期望 .
将导致
value == 2
.试试这个 :
在相关的说明中,如果要从
System.Enum
获取int
值,则给出e
这里:您可以使用:
最后两个是丑陋的 . 我更喜欢第一个 .
尝试这个而不是将枚举转换为int:
也许我错过了它,但有人试过一个简单的通用扩展方法 . 这对我很有用 . 您可以通过这种方式避免API中的类型转换,但最终会导致更改类型操作 . 这是编程Roselyn以使编译器为您创建GetValue方法的好例子 .
由于Enums可以是任何整数类型(
byte
,int
,short
等),因此获得枚举的基础整数值的更健壮的方法是将GetTypeCode
方法与Convert
类结合使用:无论底层整数类型如何,这都应该有效 .
刚刚施放枚举,例如
以上内容适用于您在野外看到的绝大多数枚举,因为枚举的默认基础类型是
int
.但是,正如cecilphillip所指出的,枚举可以有不同的底层类型 . 如果枚举声明为
uint
,long
或ulong
,则应将其强制转换为枚举的类型;例如对于你应该使用
如果你想得到一个存储在变量中的枚举值的整数,如果类型为
Question
,要在方法中使用,你可以简单地这样做我在这个例子中写的:这会将窗口 Headers 更改为4,因为变量
Geselecteerd
是Talen.Nederlands
. 如果我将其更改为Talen.Portugees
并再次调用该方法,则文本将更改为3 .我很难在互联网上找到这个简单的解决方案而我找不到它,所以我正在测试一些东西并发现了这一点 . 希望这可以帮助 . ;)
如何改为扩展方法:
而且用法稍微漂亮一些:
在Vb . 它应该是
将其声明为具有公共常量的静态类:
然后你可以引用它作为
Question.Role
,它总是评估为int
或你定义的任何东西 .还有一种方法:
将导致:
我能想到的最简单的解决方案是重载
Get(int)
方法,如下所示:其中
[modifiers]
通常与Get(int)
方法相同 . 如果您无法编辑Questions
类或由于某种原因不想编辑,可以通过编写扩展来重载该方法:以下是扩展方法
我想建议'从enum获得'int'值的例子是,'
现在的答案是1 .
我希望这可能对某人有所帮助 .
我最喜欢使用int或更小的枚举:
对于一个枚举
这个
输出
Disclaimer: 对基于long的枚举不起作用
要确保存在枚举值,然后解析它,您还可以执行以下操作 .
我希望这有帮助 .
由于可以使用多个基本类型声明枚举,因此用于转换任何枚举类型的通用扩展方法可能很有用 .
您可以通过对定义的枚举类型实现 Extension Method 来执行此操作:
这简化了获取当前枚举值的int值:
要么