C#::列挙型(enum)にインスタンスメソッドをつけるよ!!
- C#3.0(VS2008)以降にする
- 拡張メソッドを定義する
以上。
これだけではあまりにもアレなので、手元のコードから利用例でも貼っておきましょうか。
基本的に値一個分のデータしか持たない列挙型でインスタンスメソッドを持ってもあまり旨みがないので、属性を使ってパラメータ的なものを持たせるとぐっとおいしくなります。クラス名か何かを持たせてそれをリフレクションでnewすれば色々できるかもね?
/// <summary> マップチップの型</summary> public enum MapChipType : byte { [MapChipAttribute('?', 10)] Unknown, [MapChipAttribute('.', 10)] Normal, //平野 [MapChipAttribute('W', 15)] Wood, //森 [MapChipAttribute('M', 30)] Mountain, //山 } /// <summary>MapChipTypeにつける属性</summary> public class MapChipAttribute : Attribute { public MapChipAttribute(char c, int m){ Code = c; MoveCost = m; } /// <summary>マップコード</summary> public char Code; /// <summary>移動コスト</summary> public int MoveCost; } /// <summary>MapChipTypeに対する拡張メソッド</summary> public static class MapChip { /// <summary>属性辞書</summary> static IDictionary<MapChipType, MapChipAttribute> dic; /// <summary>逆引き辞書</summary> static IDictionary<char, MapChipType> revDic; /// <summary>初期化(辞書準備)</summary> static MapChip(){ dic = (from def in typeof(MapChipType).GetMembers() select new { def, attr = def.GetCustomAttributes(typeof(MapChipAttribute), false) .Cast<MapChipAttribute>().FirstOrDefault() } into d where d.attr != null select d) .ToDictionary(attr => (MapChipType)Enum.Parse(typeof(MapChipType), attr.def.Name), attr => attr.attr); revDic = dic.ToDictionary(kv => kv.Value.Code, kv => kv.Key); } /// <summary>マップコード取得</summary> /// <param name="t">マップチップタイプ</param> /// <returns>マップコード</returns> public static char Code(this MapChipType t){ return dic[t].Code; } /// <summary>移動コスト取得</summary> /// <param name="t">マップチップタイプ</param> /// <returns>移動コスト</returns> public static int MoveCost(this MapChipType t){ return dic[t].MoveCost; } /// <summary>(オマケ)マップコードからマップチップタイプへの変換</summary> /// <param name="code">マップコード</param> /// <returns>マップチップタイプ</returns> public static MapChipType GetMapChipType(char code){ MapChipType res; if (!revDic.TryGetValue(code, out res)){ res = MapChipType.Unknown; } return res; } }
次のようにして使います。
var t = MapChip.GetMapChipType('W');
var cost = t.MoveCost();
ねっ、簡単でしょっ?