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

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


基本的な方法

まずは一番シンプルな方法。このenumの拡張メソッドを作ります。
※拡張メソッドは、static class にしか書けないので注意

public static class FadeEnum
{
    public enum FadeType
    {
        BASIC,
    }

    //enum -> string
    public static string GetFadeTypeVal(this FadeType fadeType)
    {
        switch (fadeType)
        {
            case FadeType.BASIC: return "透過フェード";
        }
        return string.Empty;
    }

    //string -> enum
    public static FadeType GetFadeType(string val)
    {
        foreach (FadeType value in Enum.GetValues(typeof(FadeType)))
        {
            if (value.GetFadeTypeVal().Equals(val))
            {
                return value;
            }
        }
        return FadeType.BASIC;
    }
}

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

string val = FadeType.BASIC.GetFadeTypeVal();
FadeType type = FadeEnum.GetFadeType(val);

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

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

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

bleis-tift.hatenablog.com