もんりぃ is undefined.

育児ネタとか、技術ネタとか。

生の Unity では Enum.TryParse が使えないので、なんとかしてみた。

TL;DR

Enum.TryParse とは?

  • 文字列を任意の enum にパースするメソッド
  • bool Enum.TryParse<T>(string stringValue, out T enumValue) ってな感じのシグネチャ
    • 引数はパースしたい文字列とパース結果の enum 型を格納する変数
    • 戻り値はパースに成功したかどうか

使い方はこんな感じ

class Sample {
    enum Hoge {
        Unknown,
        Foo,
        Bar,
    }
    void Fuga() {
        Hoge hoge;
        if (!Enum.TryParse("Fuga", out hoge)) {
            hoge = Hoge.Unknown;
        }
    }
}

そもそも enum の文字列表現をそのまま利用するのはどうなんだ?みたいな話もあるが、まぁそれは横に置いておく。

何で使えないの?

  • Enum.TryParse は .NET 4.0 から登場するメソッドです
  • 2017年7月現在、Unity が採用している C# .NET バージョンは 3.5 です
    • Experimental として Unity 2017 から .NET 4.6 が利用できるけどね
    • IntelliJ Rider とか使って書いてると一見コンパイル通りそうだけど、Unity でのコンパイルは思いっきり転けます

じゃあどうする?

ないなら作りましょう

使い方

using ForwardCompatibility;

class Sample {
    enum Hoge {
        Unknown,
        Foo,
        Bar,
    }
    void Fuga() {
        Hoge hoge;
        if (!Enum.TryParse("Fuga", out hoge)) {
            hoge = Hoge.Unknown;
        }
    }
}

ポイント

  • ForwardCompatibility という namespace を切りました。
  • using ForwardCompatibility; とすることでそのまま Enum.TryParse と記述可能です。
    • 反面、元々の System.Enum のメソッドが使えなくなるので、 using するか完全修飾するかは貴方次第です。
  • Generics を使わずに typeof(Hoge) 的な引数を受け付けるメソッド作ろうかと思ったけど、メンドイのでやめた。