路人信 發表於 2025-10-16 09:07:07

在.NET Core中获取枚举值中文描述的方法详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 创建自定义特性</a></li><li><a href="#_label1">2. 定义使用中文描述的枚举</a></li><li><a href="#_label2">3. 创建扩展方法</a></li><li><a href="#_label3">4. 使用示例</a></li><li><a href="#_label4">5. 替代方案:使用 System.ComponentModel.DescriptionAttribute</a></li></ul></div><p>Net项目中有如下枚举值:</p>
<div class="jb51code"><pre class="brush:csharp;">public enum UserStatus
{
   
    Inactive = 0,
   
   
    Active = 1,
   
   
    Disabled = 2,
   
   
    Pending = 3
}</pre></div>
<p>请问,如何获取其中某一个枚举值的描述呢?</p>
<p>在 .NET Core 中获取枚举值的中文描述,可以通过以下步骤实现:</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 创建自定义特性</h2>
<div class="jb51code"><pre class="brush:csharp;">using System;

/// &lt;summary&gt;
/// 枚举描述特性
/// &lt;/summary&gt;
public class DescriptionAttribute : Attribute
{
    public string Description { get; }

    public DescriptionAttribute(string description)
    {
      Description = description;
    }
}</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>2. 定义使用中文描述的枚举</h2>
<div class="jb51code"><pre class="brush:csharp;">public enum UserStatus
{
   
    Inactive = 0,
   
   
    Active = 1,
   
   
    Disabled = 2,
   
   
    Pending = 3
}
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 创建扩展方法</h2>
<div class="jb51code"><pre class="brush:csharp;">using System;
using System.ComponentModel;
using System.Reflection;

public static class EnumExtensions
{
    /// &lt;summary&gt;
    /// 获取枚举值的描述
    /// &lt;/summary&gt;
    /// &lt;param name="value"&gt;枚举值&lt;/param&gt;
    /// &lt;returns&gt;描述信息&lt;/returns&gt;
    public static string GetDescription(this Enum value)
    {
      if (value == null)
            return string.Empty;

      var field = value.GetType().GetField(value.ToString());
      if (field == null)
            return value.ToString();

      // 尝试获取DescriptionAttribute
      var attribute = field.GetCustomAttribute&lt;DescriptionAttribute&gt;();
      if (attribute != null)
            return attribute.Description;

      // 如果没有DescriptionAttribute,返回枚举名称
      return value.ToString();
    }

    /// &lt;summary&gt;
    /// 获取枚举类型的所有值和描述
    /// &lt;/summary&gt;
    /// &lt;typeparam name="T"&gt;枚举类型&lt;/typeparam&gt;
    /// &lt;returns&gt;值和描述的字典&lt;/returns&gt;
    public static Dictionary&lt;int, string&gt; GetEnumDescriptions&lt;T&gt;() where T : Enum
    {
      var result = new Dictionary&lt;int, string&gt;();
      var values = Enum.GetValues(typeof(T));

      foreach (T value in values)
      {
            result.Add(Convert.ToInt32(value), value.GetDescription());
      }

      return result;
    }

   /// &lt;summary&gt;
   /// 获取枚举类型的所有值和描述
   /// &lt;/summary&gt;
   /// &lt;typeparam name="T"&gt;枚举类型&lt;/typeparam&gt;
   /// &lt;returns&gt;值和描述的字典&lt;/returns&gt;
   public static Dictionary&lt;T, string&gt; GetEnumDescriptionsDict&lt;T&gt;() where T : Enum
   {
         return Enum.GetValues(typeof(T))
                  .Cast&lt;T&gt;()
                  .ToDictionary(e =&gt; e, e =&gt; e.GetDescription());
   }
}</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 使用示例</h2>
<div class="jb51code"><pre class="brush:csharp;">
Console.WriteLine("Hello, World!");

// 示例1:获取单个枚举值的描述
UserStatus status = UserStatus.Active;
string description = status.GetDescription();
Console.WriteLine($"状态描述: {description}"); // 输出: 状态描述: 已激活

// 示例2:遍历所有枚举值
foreach (UserStatus value in Enum.GetValues(typeof(UserStatus)))
{
    Console.WriteLine($"{value}: {value.GetDescription()}");
}

// 示例3:获取所有枚举值的字典
var statusDict = EnumExtensions.GetEnumDescriptions&lt;UserStatus&gt;();
foreach (var item in statusDict)
{
    Console.WriteLine($"值: {item.Key}, 描述: {item.Value}");
}
Console.ReadKey();</pre></div>
<p>打印结果:</p>
<blockquote><p>Hello, World!<br />状态描述: 已激活<br />Inactive: 未激活<br />Active: 已激活<br />Disabled: 已禁用<br />Pending: 待审核<br />值: 0, 描述: 未激活<br />值: 1, 描述: 已激活<br />值: 2, 描述: 已禁用<br />值: 3, 描述: 待审核</p></blockquote>
<p class="maodian"><a name="_label4"></a></p><h2>5. 替代方案:使用 System.ComponentModel.DescriptionAttribute</h2>
<p>如果不想创建自定义特性,也可以直接使用 .NET 内置的&nbsp;<code>DescriptionAttribute,代码如下:</code></p>
<div class="jb51code"><pre class="brush:csharp;">using System.ComponentModel;

public enum UserStatus
{
   
    Inactive = 0,
   
   
    Active = 1
}

// 修改扩展方法中的引用
public static class EnumExtensions
{
    public static string GetDescription(this Enum value)
    {
      if (value == null)
            return string.Empty;

      var field = value.GetType().GetField(value.ToString());
      if (field == null)
            return value.ToString();

      // 使用System.ComponentModel.DescriptionAttribute
      var attribute = field.GetCustomAttribute&lt;DescriptionAttribute&gt;();
      if (attribute != null)
            return attribute.Description;

      return value.ToString();
    }
}</pre></div>
頁: [1]
查看完整版本: 在.NET Core中获取枚举值中文描述的方法详解