C# 获取枚举名称的 5 个方法

Coding-144

前言

嗨,大家好!

在这个快节奏的编程世界里,有时候我们会遇到一些看似简单但又容易让人头疼的问题。

比如,如何优雅地获取枚举名称?

想像一下,你在处理操作类型时,将不同的操作类型放在一个枚举里,提高代码的可读性,但是需要将它们存储在数据表中,或者打印到日志上,以便后续排查问题。这是一个很常见的开发场景。

C# 为我们提供了多种解决方案来轻松获取枚举名称,这些方法各有千秋,适合不同场景。

让我们一起来看看吧!

1. Enum.GetName

Enum.GetName 方法能够通过枚举的值来获取对应的名称

enum Colors
{
    Red,
    Green,
    Blue
}

Colors color = Colors.Green;
string name = Enum.GetName(typeof(Colors), color);

Console.WriteLine(name); // Output: Green

这个方法就像是去图书馆找书,你告诉图书管理员你要找哪本书(枚举类型)和它的编号(枚举值),图书管理员便能迅速地告诉你书名(枚举名称)。

优点是简单明了,但每次调用都会创建一个新的字符串对象,如果频繁调用可能会导致一些额外的内存开销

2. Enum.ToString

你还可以直接调用枚举值的 ToString 方法,轻松获取名称

string name = Colors.Red.ToString();
Console.WriteLine(name); // Output: Red

这个方法就像是直接把书名标签撕下来给你看,简单直接。但需注意,如果枚举值没有定义,返回的会是数字字符串(例如 “0”),这时你可能需要进行额外的处理。

3. Convert.ToString

另一个选项是使用 Convert.ToString 方法。这个方法的通用性更强,适用于多种类型

Color color = Color.Red;
string name = Convert.ToString(color);
Console.WriteLine(name); // 输出: Red

不过,这个方法相较于 Enum.ToString 多了一层转换,因此性能稍逊一筹

4. 使用 Enum.GetNames 方法

Enum.GetNames 方法能够一次性获取枚举中所有名称的数组

string[] names = Enum.GetNames(typeof(Colors));
foreach (string name in names)
{
    Console.WriteLine(name);
}
// Output:
// Red
// Green
// Blue

这个方法就像是拿到了一本图书馆的目录册,上面列出了所有书的名字(枚举名称)。

它一次性获取所有枚举名称,适合批量操作,但返回的是一个数组,如果只需要一个名称,会有额外的内存开销

5. 使用反射和 FieldInfo

使用反射也可以获取枚举名称,通过 Type.GetField 方法

using System.Reflection;

Colors color = Colors.Blue;
FieldInfo fieldInfo = typeof(Colors).GetField(color.ToString());
Console.WriteLine(fieldInfo.Name); // Output: Blue

反射通常是效率最差的选择,因为每次调用都要经过类型的查找和字段的访问,但在需要动态获取枚举值或描述属性等情况下,却可以非常灵活

总结

每种方法都有自己的特点和适用场景。

如果你只是偶尔需要获取一个枚举名称,Enum.ToStringEnum.GetName 是最简单直接的选择。

如果你需要批量获取所有枚举名称,Enum.GetNames 是最合适的方法。

反射虽然效率不高,但在某些特定场景下非常有用。

好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!

最后,如果你有更好的想法或建议,欢迎留言讨论!

往期精彩

  1. 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
  2. C#12 中 5 个节省你开发时间的的改进
  3. C# 静态类,高手不想让你知道的 15 个真相
  4. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  5. 用 C# Stopwatch 计时,让代码性能飞起来!
  6. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  7. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  8. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  9. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  10. C# AutoMapper 10个常用方法总结
  11. C# 7个方法比较两个对象是否相等
  12. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号,更多干货等你来!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值