【C#】C#のenumでメソッドやフィールドを定義する方法

自分はjava出身のなので、C#のenumがメソッドやフィールドが定義できないのが不便だったのですが、
拡張メソッド使ってjavaのenumに近いことができる。
現場でもこれを使っている人が多いので割とスタンダードな方法っぽいです。


まずはこんなenumを例にして説明を書いていくぞ。

public enum SHOP_TYPE
{
    DECO, //デコ
    GROUND, //床
    FOOD, //ごはん
    GOOD, //備品
}

基本的な方法

まずは一番シンプルな方法。このenumの拡張メソッドを作ります。

public static class EnumExtension
{
    //ショップ商品タイプ名
    public static string GetShopTitle(this SHOP_TYPE shopType)
    {
        switch (shopType)
        {
            case SHOP_TYPE.DECO: return "デコ";
            case SHOP_TYPE.GROUND: return "床";
            case SHOP_TYPE.FOOD: return "ごはん";
            case SHOP_TYPE.GOOD: return "備品";
        }
        return "";
    }

    //ショップ商品タイプごとの説明
    public static string GetShopInfo(this SHOP_TYPE shopType)
    {
        switch (shopType)
        {
            case SHOP_TYPE.DECO: return "デコを購入して庭を飾り付けよう";
            case SHOP_TYPE.GROUND: return "庭の地面を変更するよ";
            case SHOP_TYPE.FOOD: return "キャラクター達の食料";
            case SHOP_TYPE.GOOD: return "いろいろなものが売っているよ";
        }
        return "";
    }
}

▼使う側はこんな形で使える

//unityなら「デコ-デコを購入して庭を飾り付けよう」とコンソールに表示されます
Debug.Log(SHOP_TYPE.DECO.GetShopTitle() + "-" + SHOP_TYPE.DECO.GetShopInfo());

この実装方法の良くないところ

ただこの実装方法には、懸念がある。
enumの定義を追加したら、拡張メソッドのcase文も追加する必要があるが、追加し忘れる可能性がある。
javaなら必ず各メソッド内の内容を定義しなおさないとコンパイルが通らない状態が作れるが、上述した方法だと、
case文に追加しなくてもコンパイルは通ってしまうので、実行するまでバグに気づくことができないのである。

とはいえ、これを解決しようとするとこのくらいの実装が必要になってくる↓

bleis-tift.hatenablog.com