c#——Enum之自定义属性

本文介绍了一种为枚举类型添加备注特性的方法,并提供了获取备注及通过备注反查枚举值的实用扩展方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义枚举类型的备注特性,作为数据展示使用

代码非常简单,只需要继承Attribute,写自定义属性即可

    /// <summary>
    /// 备注特性
    /// </summary>
    public class RemarkAttribute : Attribute
    {
        public RemarkAttribute(string remark)
        {
            this.Remark = remark;
        }
        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }
    }
}


然后在枚举类型的每个字段上添加该属性标签

  [DataContract]
    public enum MongoLogicOp
    {
        /// <summary>
        /// 满足所有组合条件
        /// </summary>
        [Remark( "$and")]
        And,
        /// <summary>
        /// 满足任意组合条件
        /// </summary>
        [Remark("$or")]
        Or
    }


那么以上是否就足够了呢,当然没有那么简单了。

我们还需要编写 根据枚举字段获得其remark标签 以及其逆向过程

这样我们才能够使用自定义标签,让自定义标签发挥作用

接下来写一个枚举类型的扩展

扩展中包含两个扩展方法,可供方便使用

/// <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;
    }

    /// <summary>
    /// 获取备注信息对应的枚举值
    /// </summary>
    /// <param name="remark"></param>
    /// <returns></returns>
    public static string ByRemark<T>(this string remark)
    {
        Type type = typeof(T);
        FieldInfo[] fds = type.GetFields();
        foreach (var fd in fds)
        {
            object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
            foreach (RemarkAttribute attr in attrs)
            {
                var name = attr.Remark;
                if (name == remark)
                    return fd.Name;
            }
        }
        return null;
    }
}


### C#Enum 的使用方法和特性 #### 定义与基本用法 在 C# 中,`enum` 是一种特殊的数据类型,用于定义一组命名的常量。通过 `enum` 可以提高代码的可读性和维护性。默认情况下,枚举成员的底层类型为 `int`,但可以通过指定其他整数类型(如 `byte`, `sbyte`, `short`, `ushort`, `uint`, `long`, `ulong`)来改变其基础类型[^2]。 以下是定义一个简单枚举并访问其值的例子: ```csharp public enum Colors { Red, Green, Blue } class Program { static void Main() { Console.WriteLine((int)Colors.Red); // 输出: 0 Console.WriteLine((int)Colors.Green); // 输出: 1 Console.WriteLine((int)Colors.Blue); // 输出: 2 } } ``` 如果需要自定义枚举值,则可以在定义时显式赋值: ```csharp public enum Numbers { One = 1, Two = 2, Three = 3 } ``` #### 枚举特性的应用 为了增强枚举的功能,通常会为其添加特性(Attributes),以便提供额外的信息或行为控制。例如,可以使用 `[Description]` 属性为每个枚举项附加描述文字[^3]。 下面是一个带有描述属性的枚举示例及其获取描述的方法: ```csharp using System; using System.ComponentModel; public enum DaysOfWeek { [Description("星期一")] Monday, [Description("星期二")] Tuesday } static class EnumExtensions { public static string GetDescription<T>(this T value) where T : Enum { var fieldInfo = typeof(T).GetField(value.ToString()); var attribute = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); return attribute.Length > 0 ? attribute[0].Description : value.ToString(); } } class Program { static void Main() { Console.WriteLine(DaysOfWeek.Monday.GetDescription()); // 输出: 星期一 Console.WriteLine(DaysOfWeek.Tuesday.GetDescription());// 输出: 星期二 } } ``` #### 标志枚举 (`[Flags]`) 当需要表示多个选项组合的情况时,可以使用 `[Flags]` 特性修饰枚举。这允许将不同的枚举值按位操作结合起来形成复合状态[^5]。 以下是如何声明以及如何判断某个标志是否被设置的一个例子: ```csharp [Flags] public enum Permissions { None = 0, Read = 1 << 0, // 或者写作 1 Write = 1 << 1, // 或者写作 2 Execute = 1 << 2, // 或者写作 4 All = Read | Write | Execute } class Program { static void Main() { Permissions userPermissions = Permissions.Read | Permissions.Write; if ((userPermissions & Permissions.Read) != 0) Console.WriteLine("User has read permission."); if (!userPermissions.HasFlag(Permissions.Execute)) Console.WriteLine("User does not have execute permission."); } } ``` 以上展示了如何利用 `[Flags]` 创建一个多选集合,并演示了两种常见的检测逻辑——直接按位比较或者借助 `.HasFlag()` 方法。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值