根据值获取枚举字符串名称

582

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

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}
在我的数据库中,枚举是通过值进行引用的。我的问题是,如何将枚举的数字表示转换回字符串名称。
例如,给定“2”,结果应该是“Visible”。
15个回答

735

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

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

14
更新:只有使用 IFormatProvider 的某些重载已经被弃用。ToString() 是可用的。请参见 http://groups.google.com/group/DotNetDevelopment/browse_thread/thread/dcdbeae086360208 - AndyM
enum Foo { A = 1, B= 1 } 的行为是什么? - dbkk
5
文档中提到,关于枚举类型,“你的代码不应该对返回的字符串有任何假设”,这是因为正如你引用的确切情况一样。请参见http://msdn.microsoft.com/en-us/library/16c1xs4z.aspx。 - Paul D'Ambra
12
一个更新的解决方案:http://msdn.microsoft.com/en-us/library/system.enum.getname%28v=vs.110%29.aspx - Jack
7
变量stringValue的值是将枚举类型EnumDisplayStatus转换为字符串后得到的结果,代码如下:((EnumDisplayStatus)value).ToString()。 - redwards510

259
如果您需要获取字符串"Visible"而不获取EnumDisplayStatus实例,可以这样做:

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

5
如果您看到Mandoleen的回答,有一个错误:Enum.GetName返回一个字符串,而不是一个枚举。 - algreat
比被接受的答案好多了。 - Yoda
对我来说没问题! - lakjeewa Wijebandara

205

试试这个:

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

95

使用这个:

string bob = nameof(EnumDisplayStatus.Visible);

17
需要使用C# 6及以上版本。 - Adam K Dean
8
如果你想传递一个变量,那么这个解决方案无法使用。 - m_j_alkarkhi

50

使用nameof表达式,是最快的编译时解决方案。

返回枚举类型的字面量大小写或在其他情况下返回classstruct任何类型variable(arg、param、local等)。

public enum MyEnum {
    CSV,
    Excel
}


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

注意:

  • 您不希望将枚举名称完全使用大写字母命名,但这个示例用于展示 nameof 区分大小写的特性。

30

你只需要进行强制类型转换即可

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

啊..肯特比我先发了 :)


20

解决方案:

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

此外,使用GetName比使用枚举的显式转换更好。 [性能基准测试代码]
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
这是一份七年前答案的复制。你能解释一下你的答案比原来的好在哪里吗? - nvoigt
@nvoigt 因为,如果我没记错的话,Enum上的ToString() API现在已经过时了。[https://learn.microsoft.com/en-us/dotnet/api/system.enum.tostring?view=netframework-4.8] - Naveen Kumar V
所以...至少另外两个答案已经提供了您发布的代码。您的代码相比Mandoleen或algreat的代码有什么优势呢? - nvoigt
@nvoigt 他们没有提到与显式转换相比的性能。这对你来说足够了吗? :p 不管怎样,谢谢,我希望它能帮助到某些人。 :) - Naveen Kumar V
1
我们似乎存在沟通问题。您是在移动设备上吗?或者您可能没有向下滚动足够远?您的回答有两个完全相同的副本,都是7年前的。我已经标明了回答者的名称,所以应该很容易找到。您的回答提供了什么内容,这些内容在至少7年前就已经存在了呢? - nvoigt

15

数据库转C#

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

C# 到数据库

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

12

给定:

enum Colors {
    Red = 1,
    Green = 2,
    Blue = 3
};

在.NET 4.7中,以下操作
Console.WriteLine( Enum.GetName( typeof(Colors), Colors.Green ) );
Console.WriteLine( Enum.GetName( typeof(Colors), 3 ) );

将显示

Green
Blue

在.NET 6中,以上内容仍然适用,但也增加了以下内容:
Console.WriteLine( Enum.GetName( Colors.Green ) );
Console.WriteLine( Enum.GetName( (Colors)3 ) );

将显示:

Green
Blue

8

只需要:

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

2
在大多数情况下,这基本上与10年前的最佳答案几乎完全相同;添加“f”说明符是微妙的,可能是调用者想要的,也可能不是(这取决于:他们想要什么):https://learn.microsoft.com/en-us/dotnet/standard/base-types/enumeration-format-strings - Marc Gravell
1
我没有注意到日期啊哈哈。我认为更新一下旧的解决方案是很好的选择,就像这个一样。我不会是最后一个打开这个页面的人。感谢你的精确! :) - Al3x_M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接