C# 给枚举类型增加一个备注特性

简介: /// /// 备注特性 /// public class RemarkAttribute : Attribute { /// /// 备注 /// public stri...
  /// <summary>
    /// 备注特性
    /// </summary>
    public class RemarkAttribute : Attribute
    {
        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }

        public RemarkAttribute(string remark)
        {
            this.Remark = remark;
        }
    }
复制代码
复制代码
    /// <summary>
    /// 枚举扩展类
    /// </summary>
    public static class EnumExtension
    {
        /// <summary>
        /// 获取枚举的备注信息
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        public static string GetRemark(this Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            if (fi == null)
            {
                return value.ToString();
            }
            object[] attributes = fi.GetCustomAttributes(typeof(RemarkAttribute), false);
            if (attributes.Length > 0)
            {
                return ((RemarkAttribute)attributes[0]).Remark;
            }
            else
            {
                return value.ToString();
            }
        }

        public static string GetEnumDescription(this Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attributes.Length > 0)
            {
                return attributes[0].Description;
            }
            else
            {
                return value.ToString();
            }
        }
    }
复制代码
复制代码
            var aaa = UserType.Type1.GetRemark();
var aab = UserType.Type2.GetEnumDescription();


一、引言

 
 

枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息

 
 

比如要获得 TestEmun.aaa 属性值得备注 AAA,比较不方便得到。

 
 

    public enum TestEmun
    {

 
 

      /// AAA
      aaa =1,
      /// BBB
      bbb =2,
      /// CCC
      ccc =3
    }

 
 

 

 
 

如果要得到类似的效果,我们就需要修改一下代码了,使用反射很容易得到这个结果。

 
 

 

 
 

二、定义特性

 
 

using System;


using System.Reflection;


namespace Lib.DataModel.SysEnum
{
  /// <summary>
  /// 备注特性
  /// </summary>
  public class RemarkAttribute : Attribute
  {
    private string m_remark;
    public RemarkAttribute(string remark)
    {
      this.m_remark = remark;
    }
    /// <summary>
    /// 备注
    /// </summary>
    public string Remark
    {
      get { return m_remark; }
      set { m_remark = value; }
    }
    /// <summary>
    /// 获取枚举的备注信息
    /// </summary>
    /// <param name="val">枚举值</param>
    /// <returns></returns>
    public static string GetEnumRemark(Enum val)
    {
      Type type = val.GetType();
      FieldInfo fd = type.GetField(val.ToString());
      if (fd == null) 
        return string.Empty;
      object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
      string name = string.Empty;
      foreach (RemarkAttribute attr in attrs)
      {
        name = attr.Remark;
      }
      return name;
    }
  }
  /// <summary>
  /// 枚举扩展类
  /// </summary>
  public static class EnumExtension
  {
    /// <summary>
    /// 获取枚举的备注信息
    /// </summary>
    /// <param name="em"></param>
    /// <returns></returns>
    public static string GetRemark(this Enum em)
    {
      Type type = em.GetType();
      FieldInfo fd = type.GetField(em.ToString());
      if (fd == null)
        return string.Empty;
      object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
      string name = string.Empty;
      foreach (RemarkAttribute attr in attrs)
      {
        name = attr.Remark;
      }
      return name;
    }
  }

}

 
 

 

 
 

三 、测试代码

 
 



  public class UnitTest
  {
    public enum TestEmun
    {
      [Remark("AAA")]
      aaa,
      [Remark("BBB")]
      bbb,
      [Remark("CCC")]
      ccc
    }


    public void GetEnumName()
    {
      //需要引用 Lib.DataModel.SysEnum 命名空间才可以使用 扩展方法
      string name = TestEmun.aaa.GetRemark();
      /*
       name 值为 AAA
       */
    }
  }

 
 

 

 
 

四、扩展

 
 

//获取枚举的所有属性名称
var fields = typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (var fi in fields)

 
 

    Console.WriteLine(fi.Name);

 
 


原文地址:http://blog.csdn.net/xxj_jing/article/details/8556780

 
目录
相关文章
|
6月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
6月前
|
C#
C#数据类型之枚举类型
C#数据类型之枚举类型
149 0
|
6月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
6月前
|
编译器 C# 开发者
C# 9.0中的顶级语句:简化程序入口的新特性
【1月更文挑战第13天】本文介绍了C# 9.0中引入的顶级语句(Top-level statements)特性,该特性允许开发者在不使用传统的类和方法结构的情况下编写简洁的程序入口代码。文章详细阐述了顶级语句的语法、使用场景以及与传统程序结构的区别,并通过示例代码展示了其在实际应用中的便捷性。
|
16天前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
33 7
C# 9.0 新特性解析
|
15天前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
28 2
|
2月前
|
编译器 C# Android开发
震惊!Uno Platform 与 C# 最新特性的完美融合,你不可不知的跨平台开发秘籍!
Uno Platform 是一个强大的跨平台应用开发框架,支持 Windows、macOS、iOS、Android 和 WebAssembly,采用 C# 和 XAML 进行编程。C# 作为其核心语言,持续推出新特性,如可空引用类型、异步流、记录类型和顶级语句等,极大地提升了开发效率。要在 Uno Platform 中使用最新 C# 特性,需确保开发环境支持相应版本,并正确配置编译器选项。通过示例展示了如何在 Uno Platform 中应用可空引用类型、异步流、记录类型及顶级语句等功能,帮助开发者更好地构建高效、优质的跨平台应用。
208 59
|
1月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
36 1
|
3月前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
|
3月前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
35 0