值的枚举字符串名称


407

我有一个像这样的枚举构造:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

在我的数据库中,枚举是按值引用的。我的问题是,如何将枚举的数字表示形式返回到字符串名称。

例如,给定2结果应为Visible


25
我相信,现在有了VS 2015 nameof(EnumDisplayStatus.Visible)可以更轻松地完成此任务,希望对您有所帮助
Gabriel Marius Popescu

Answers:


542

您可以int通过简单的强制转换将其转换回枚举成员,然后调用ToString()

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

13
更新:仅弃用使用IFormatProvider的某些重载。ToString()很好。见groups.google.com/group/DotNetDevelopment/browse_thread/thread/...
AndyM

发生什么情况enum Foo { A = 1, B= 1 }
dbkk 2011年

3
@dbkk文档指出,对于枚举“您的代码不应对将返回哪个字符串做任何假设”。因为您引用的确切情况。参见msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra


4
更短:var stringValue =(((EnumDisplayStatus)value).ToString()
redwards510 '17

188

如果您需要获取字符串"Visible"而不获取EnumDisplayStatus实例,则可以执行以下操作:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

5
如果您对Mandoleen的答案有误,那就是不准确:Enum.GetName返回一个字符串,而不是一个Enum
很棒的2013年

这是使用反射还是编译器创建了一个辅助字典供在幕后使用?
palswim

155

尝试这个:

string m = Enum.GetName(typeof(MyEnumClass), value);

@nilco这个答案很好,但是我更喜欢Kents的答案,主要是因为我在枚举“ Description”上有一个自定义属性,然后我有了一个枚举扩展来获取描述-这是为了在屏幕上为用户显示。
哈拉格

60

用这个:

string bob = nameof(EnumDisplayStatus.Visible);

9
但是需要C#6+。
亚当·K·迪恩

10
当然,@ AZChad是一件很棒的事情;但这并不能真正应用于OP的场景中,因为值来自数据库(因此:运行时,而不是编译时,值)
Marc Gravell

22

你可以投下

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

啊..肯特击败了我:)


现在,肯特获得了所有“第一答案”代表。好一个肯特!:p
Matt Kocaj

12

数据库到C#

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

C#到DB

string dbStatus = ((int)status).ToString();

12

解:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

同样,使用GetName优于Enum的显式转换

[绩效基准代码]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[样品结果]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002

2
这是7年前答案的副本。你能解释一下为什么你的比原来更好吗?
nvoigt

@nvoigt因为,如果我是对的,则Enum上的ToString()API现在已过时。[ docs.microsoft.com/en-us/dotnet/api/...
纳温库马尔V

所以...至少其他两个答案已经提供了您发布的代码。与Mandoleen或algreat提供的相比,您提供了什么?
nvoigt

@nvoigt他们没有提到与显式铸造相比的性能。这足以让您喜欢我的答案吗?:p无论如何,我希望它能对某人有所帮助。:)
Naveen Kumar V

我们似乎有沟通问题。您是在移动设备上还是向下滚动不够远?从7年前起,您的答案就有两份精确的副本。我为应答者命名,因此应该很容易找到它们。您的答案提供了至少7年来没有出现的内容?
nvoigt

9

使用nameof expression的最快的编译时解决方案。

返回枚举的文字。

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

注意:

  • 您不想以全大写字母来命名枚举,而是用来演示的区分大小写nameof

这应该是一个答案。
LinPy粉丝

@LinPyfan很高兴它运作良好!与OP日期相比,这是一个相对较新的日期。

4

只需要:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"

1
在大多数情况下,这与10年前的最高答案几乎相同;添加的"f"说明符细致入微,并可能会或不会被调用者想要的东西(这取决于:他们想要什么):docs.microsoft.com/en-us/dotnet/standard/base-types/...
马克·Gravell

我没注意约会的日期。我认为最好更新这样的旧解决方案。我不会是最后一个打开此页面的人。并感谢您的精确!:)
Al3x_M

3

要获取字符串值[Name]:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

为了获得枚举值:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));

为什么不只是.ToString()?'捂脸'
MeTitus

3

我已经使用了下面给出的这段代码

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()

1

只需将int强制转换为枚举类型:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.