美文网首页
C#给枚举加自定义特性

C#给枚举加自定义特性

作者: 段煜华 | 来源:发表于2019-06-19 10:38 被阅读0次

通常我们需要定义一组特定值。采用枚举再好不过了。它可以让我们很方便直观的管理一组固定的值。如果我们需要对应输出枚举值的汉语意思或者颜色样式等,我们可以这样实现:

首先定义一个枚举类

enum @enum
{
    Update = 1,
    Insert = 2
}

方式一(if语句)

if (@enum == 1)
{
    Console.Write("更新");
}
else (@enum == 2){
    Console.Write("新增");
}

方式二(switch语句)

switch(@enum)
{
    case 1:
        Console.Write("更新");
        break;
    case 2:
        Console.Write("新增");
        break;
}

方式三(采用字典)

Dictionary<int, string> dic = new Dictionary<int, string>
{
    [1] = "更新",
    [2] = "新增"
};
Console.Write(dic[@enum]);

现在我们用一种更加优雅的方式来实现,给枚举加特性

在System.ComponentModel命名空间下有一个特性Description,用来指定属性或事件的描述。

enum @enum
{
    [Description("修改")]
    Update = 1,
    [Description("新增")]
    Insert = 2
}

我们可以写一个扩展,用来获取Description特性,这用反射来读取Description的值,这个是复用性的

/// <summary>
/// 获取特性 (DescriptionAttribute) 的说明;如果未使用该特性,则返回枚举的名称。可指定的默认值。
/// </summary>
/// <param name="enum"></param>
/// <param name="def">默认值</param>
/// <returns></returns>
public static string Description(this Enum @enum, string def = "")
{
    Type enumType = @enum.GetType();
    int value = int.Parse(Enum.Format(enumType, Enum.Parse(enumType, @enum.ToString()), "d"));
    FieldInfo fieldInfo = enumType.GetField(Enum.GetName(enumType, value));
    if (fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute), false) is DescriptionAttribute descriptionAttribute)
    {
        return descriptionAttribute.Description;
    }
    return def != "" ? def : @enum.ToString();
}

那么在使用的时候我们将可以很方便的获取枚举值对应的描述信息

@enum.Update.Description();

这样每次使用都只需要这一句代码便可调出枚举值的描述信息那么,如果还有其它需求怎么办,比方说,这个枚举值还需要有代表色,样式等用来渲染HTML的属性怎么办,这里就用到了自定义特性,我们先说说怎么自定义特性。其实很简单。
新建一个类,注意所有的特性类必须继承自 Attribute,代码如下:

/// <summary>
/// 指定属性的样式
/// </summary>
public class ClassAttribute : Attribute
{
    /// <summary>
    /// 值
    /// </summary>
    public string Value{ get; set; }
    /// <summary>
    /// 设置值
    /// </summary>
    /// <param name="value"></param>
    public ClassAttribute(string value) => Value = value;
}

这样一个自定义特性就建好了,那么调用的方法,和Description一样。但是如果每次添加一个自定义特性都得建立一个调取特性值的方法,是不是很累。我们要记住面向对象的三大特性之封装。我们再写一个扩展,这里用到了反射和泛型。

/// <summary>
/// 获取指定特性的值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enum"></param>
/// <param name="def">默认值</param>
/// <returns></returns>
public static String GetAttribute<T>(this Enum @enum, String def = "") where T : Attribute
{
    object[] attributes = @enum.GetType().GetMember(@enum.ToString())[0].GetCustomAttributes(typeof(T), false);
    return attributes.Length > 0 ? attributes[0].PropertyValue("Value") : def;
}

我们需要更改一下枚举

enum @enum
{
    [Description("修改"),Class("className")]
    Update = 1,
    [Description("新增"),Class("className")]
    Insert = 2
}

在使用的时候我们将可以很方便的获取到自定义特性的值

@enum.Update.GetAttribute<ClassAttribute>();

使用的时候注意引用关系。使用的时候根据实际需求做相应的调整。

相关文章

  • C#枚举类型常用扩展方法(三)

    C#获取枚举值特性(Display、Description、自定义特性) 一、Display特性 调用如下: 二、...

  • C#给枚举加自定义特性

    通常我们需要定义一组特定值。采用枚举再好不过了。它可以让我们很方便直观的管理一组固定的值。如果我们需要对应输出枚举...

  • c#特性

    c#特性: 特性(Attribute)是用于在运行时传递程序中的各种元素(比如类,方法,结构,枚举,组件等)的行为...

  • 枚举(三)

    关联值 关联值在表达能力上将枚举提升到更高层次。你可以给每个枚举案例关联自定义的相关值。 以下是关联值的特性:1 ...

  • iOS开发 - 「Swift 学习」枚举类型

    Swift 枚举类型 Swift 枚举是一组只包含自定义的特定数据,有共同特性的数据的集合。 枚举的功能: 它声明...

  • PageStatusTransformer:一种Android低

    页面状态切换 特性 构造自定义状态 可以通过字符串或枚举自定义任意状态,无须受 showLoading showE...

  • 10-枚举和结构体

    一、枚举 C#语言中提供了枚举类型,枚举是为具有一组特定值的变量特别设计的一种自定义数据类型,是一种值类型,其成员...

  • dart枚举实现

    dart 枚举不能自定义初始值,但是Dart2.7 支持了扩展枚举。我们先写一个枚举值。 枚举值是一个类, 给这个...

  • Typescript(十二)Enum 枚举类型

    Typescript中的枚举(enum)可以参考C#中的枚举(enum)类型,毕竟都是微软开发的语言。 枚举这个数...

  • C#语言特性发展史

    C#语言特性发展史 Intro 本文主要总结介绍C# 每个版本带来的不同的语言特性。 C#,读作C Sharp,是...

网友评论

      本文标题:C#给枚举加自定义特性

      本文链接:https://www.haomeiwen.com/subject/uwfhqctx.html