CSharp - 从枚举中获取int值

  显示原文与译文双语对照的内容

我有一个名为 Questions的类。 在这个类别中有一个名为问题的枚举,它看起来像这样。


public enum Question
{
 Role = 2,
 ProjectFunding = 3,
 TotalEmployee = 4,
 NumberOfServers = 5,
 TopBusinessConcern = 6
}

于中的我有个 get(int foo)Questions 类的相关函数,该函数返回一个 Questions object. 是否有一个简单的方法从枚举中获取整数值,这样我就可以像这样做 Questions.Get(Question.Role)

时间:

只需将枚举转换为。


int something = (int)Question.Role;

上面的内容适用于你在野外看到的绝大多数枚举,因为枚举的默认基础类型是 int 。

但是,就像cecilphillip指出的,枚举可以有不同的基础类型。 如果枚举被声明为 uint,long或者 ulong,那么它应该被转换为枚举的类型。

e.g 。用于


enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2.. Wolf424B = 2147483649};

你应该使用


long something = (long)StarsInMilkyWay.Wolf424B;

因为枚举可以是任何整型类型( 短,字节,int 。。等),所以获得枚举底层整数值的一种更可靠的方法是使用GetTypeCode方法和转换类结合使用


enum Sides {
 Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode()) ;
Console.WriteLine(val);

不管底层整型类型如何,它都应该工作。

将它声明为具有常量的静态类。


public static class Question
{
 public const int Role = 2;
 public const int ProjectFunding = 3;
 public const int TotalEmployee = 4;
 public const int NumberOfServers = 5;
 public const int TopBusinessConcern = 6;
}

然后你可以将它作为 Question.Role 引用,它总是计算为int或者你定义为。

例子


Public Enum EmpNo
{
Raj=1
Rahul,
Priyanka
}

在后面的代码中获取枚举值


int setempNo=(int)EmpNo.Raj;//this will give setempNo=1

或者


int setempNo=(int)EmpNo.Rahul;//this will give setempNo=2

枚举将增加 1 ;你可以设置起始值。 否则将被指派为 0.

默认情况下,枚举中每个元素的基础类型是 int 。


Question role= Question.Role ;
int val = (int)role;

你可以使用冒号指定另一个整型数字类型。


public enum Question :byte

你可以像下面这样检索值:


Question role= Question.Role ;
byte val = (byte)role;

源:。 C# 枚举示例

克里斯

它比你想象的容易- 你的枚举已经是一个 int 。 只是需要提醒:


int y = (int)Question.Role;
Console.WriteLine(y);//prints 2

编辑: 每个枚举类型都有一个基础类型,它可以是除char之外的任何整型类型。

我最近在代码中使用了枚举,转而使用带有受保护构造函数和预定义静态实例( 感谢 Roelof - C# 确保有效的枚举值- Futureproof方法 )的类。

根据这一点,下面我将如何处理这个问题( 包括隐式转换到/从 int ) 。


public class Question
{
//attributes
 protected int index;
 protected string name;
//go with a dictionary to enforce unique index
//protected static readonly ICollection<Question> values = new Collection<Question>();
 protected static readonly IDictionary<int,Question> values = new Dictionary<int,Question>();

//define the"enum" values
 public static readonly Question Role = new Question(2,"Role");
 public static readonly Question ProjectFunding = new Question(3,"Project Funding");
 public static readonly Question TotalEmployee = new Question(4,"Total Employee");
 public static readonly Question NumberOfServers = new Question(5,"Number of Servers");
 public static readonly Question TopBusinessConcern = new Question(6,"Top Business Concern");


//constructors
 protected Question(int index, string name)
 {
 this.index = index;
 this.name = name;
 values.Add(index, this);
 }

//easy int conversion
 public static implicit operator int(Question question)
 {
 return question.index;//nb: if question is null this will return a null pointer exception
 }
 public static implicit operator Question(int index)
 {
//return values.FirstOrDefault(item => index.Equals(item.index));
 Question question;
 values.TryGetValue(index, out question);
 return question;
 }

//easy string conversion (also update ToString for the same effect)
 public override string ToString()
 {
 return this.name;
 }
 public static implicit operator string(Question question)
 {
 return question == null? null : question.ToString();
 }
 public static implicit operator Question(string name)
 {
 return name == null? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase));
 }

//if you specifically want a Get(int x) function (though not required given the implicit converstion)
 public Question Get(int foo)
 {
 return foo;//(implicit conversion will take care of the conversion for you)
 }
}

这种方法的优点是你可以从枚举中获得所有内容,但是现在代码更加灵活,所以你需要根据问题的值来执行不同的操作( 例如 ) 。 在首选面向对象模式中),而不是在代码中放入大量的事例语句来处理每个场景。

如果你想获得存储在变量中的枚举值的整数,在该类型中,类型将是"问题",例如在方法中使用,你可以简单地这样做:


enum Talen
{
 Engels=1, Italiaans=2, Portugees=3, Nederlands=4, Duits=5, Dens=6
}

Talen Geselecteerd; 

public void Form1()
{
 InitializeComponent()
 Geselecteerd = Talen.Nederlands;
}

//You can use the Enum type as parameter, so any enumaration from any enumerator can be used as parameter
void VeranderenTitel(Enum e)
{
 this.Text = Convert.ToInt32(e).ToString();
}

这将把窗口标题更改为 4,因为变量"geselecteerd"是"talen 。Nederlands"。 如果我将它更改为"talen 。portugees"并再次调用该方法,文本将更改为 3 。

我很难在互联网上找到这个简单的解决方案,我找不到它,所以我正在测试somtehings并发现它。 希望这有助于帮助。

为此,你可以实施一个扩展方法定义的枚举类型: 到你


public static class MyExtensions
{
 public static int getNumberValue(this Question questionThis)
 {
 return (int)questionThis;
 }
}

这简化了当前枚举值的int值:


Question question = Question.Role;
int value = question.getNumberValue();

或者


int value = Question.Role.getNumberValue();

...