开发游戏过程中我们经常会用到枚举值,如果我们想要在某个枚举时得到一个特定的字符串描述,则可能通过下面这种方式实现。
一、通过map映射实现
public enum CharacterStatusType
{
None,
Silence,
Stun,
Weakness,
Knockdown
}
public static Dictionary<CharacterStatusType, string> statusTypeToString = new Dictionary<CharacterStatusType, string>()
{
{ CharacterStatusType.None, "无异常状态" },
{ CharacterStatusType.Silence, "沉默状态" },
{ CharacterStatusType.Stun, "眩晕" },
{ CharacterStatusType.Weakness, "虚弱" },
{ CharacterStatusType.Knockdown, "击倒" }
};
但是通过这种方式每种枚举值都要写两遍,不够优雅,因此我打算换一种方式实现。
二、采用Attribute特性实现。
using System;
using System.ComponentModel;
/// <summary>
/// 枚举特性(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();
///
/// </summary>
public static class EnumExtensions
{
public static string GetDescription<TEnum>(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();
}
}
这样使用起来就方便多了,想要枚举关联什么信息直接加就行,调用也很方便。