【Unity】给枚举使用Attribute特性实现枚举值到字符串的映射

         开发游戏过程中我们经常会用到枚举值,如果我们想要在某个枚举时得到一个特定的字符串描述,则可能通过下面这种方式实现。

一、通过map映射实现

public enum CharacterStatusType
{
    None,
    Silence,
    Stun,
    Weakness,
    Knockdown
}


public static Dictionary statusTypeToString = new Dictionary()
{
    { CharacterStatusType.None, "无异常状态" },
    { CharacterStatusType.Silence, "沉默状态" },
    { CharacterStatusType.Stun, "眩晕" },
    { CharacterStatusType.Weakness, "虚弱" },
    { CharacterStatusType.Knockdown, "击倒" }
};

但是通过这种方式每种枚举值都要写两遍,不够优雅,因此我打算换一种方式实现。

二、采用Attribute特性实现。

using System;
using System.ComponentModel;

/// 
/// 枚举特性(Attribute)
/// 
/// 示例:
/// 1.定义:
///public enum MovementDirection
///{
///    [Description("向前方移动")]
///    Forward,
///    [Description("向后方移动")]
///    Backward
///}
///public enum CharacterStatusType
///{
///    [Description("无异常状态")]
///    None,
///    [Description("沉默状态")]
///    Silence,
///    [Description("眩晕")]
///    Stun,
///    [Description("虚弱")]
///    Weakness,
///    [Description("击倒")]
///    Knockdown
///}
/// 2.使用:
/// CharacterStatusType status = CharacterStatusType.Silence;
/// string statusString = status.GetDescription();
/// MovementDirection direction = MovementDirection.Forward;
/// string directionString = direction.GetDescription();
/// 
/// 
public static class EnumExtensions
{
    public static string GetDescription(this TEnum enumValue) where TEnum : Enum
    {
        var type = typeof(TEnum);
        var field = type.GetField(enumValue.ToString());
        if (field != null)
        {
            var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attributes.Length > 0)
            {
                return ((DescriptionAttribute)attributes[0]).Description;
            }
        }

        return enumValue.ToString();
    }
}

这样使用起来就方便多了,想要枚举关联什么信息直接加就行,调用也很方便。

你可能感兴趣的:(unity,游戏引擎,c#)