ゲーム開発中に列挙値を使用することがよくありますが、列挙中に特定の文字列の説明を取得したい場合は、次の方法で実現できます。
1. マップマッピングによる実装
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, "击倒" }
};
ただし、この方法では各列挙値を 2 回記述する必要があり、十分エレガントではないため、別の方法で実装する予定です。
2. 属性特性を使用した実装。
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();
}
}
これにより、使用がより便利になり、列挙に関連付けたい情報を追加するだけでよく、呼び出しも非常に便利です。