[unity, c#] enum と数値、enum と文字列の変換を行う

以下のような enum があったとします。

enum Status
{
    None = 0,
    First,
    Second,
    Third,
    Finish = 99,
};

通常は意識しませんが、データとして保存する場合、enum のままでは都合が悪いです。
ここでは enum ↔ int や enum ↔ string などのデータ変換を紹介します。

enum から int へ変換

int number = (int)Status.Finish;

これだけです。99 が返されます。

なお、enum の数値を直接指定していない場合は 0 からの連番が割り振られます。
例では None = 0, First = 1, Second = 2, Third = 3, Finish = 99 となっています。

int から enum に変換

こちらは少し面倒なので、簡単に変換できるようメソッドを用意します。

用意したメソッド

using System;

public class EasyParse
{
    public static T Enumelate<T>(object o, T initval)
    {
        T otype = initval;
            
        if (o != null)
        {
            if (Enum.IsDefined(typeof(T), o) == true)
            {
                otype = (T)Enum.Parse(typeof(T), o.ToString());
            }
        }
            
        return otype;
    }
}

使用例

Status s = EasyParse.Enumelate(2, Status.None);  // 存在しない数値の場合、None が返る

enum から string に変換

string name = Status.Finish.ToString();

"Finish" という文字列が返されます。

string から enum に変換

System.Enum.TryParse("First", out Status s);

Status.First が変数 s に返されます。enum に存在しない場合、戻り値に false を返します。

終わりに

enum ↔ int は、enum を不用意に増やした場合に値がズレるという構造的問題を抱えています。

enum Status
{
    Minus,
    None,
    First,
    Second,
    Third,
    Finish = 99,
};

こうすると None = 1、First = 2、Second = 3... と1つずつズレてしまいます。

enum Status
{
    Minus = -1,
    None = 0,
    First = 1,
    First2 = 1,
    Second = 2,
    Third = 3,
    Finish = 4,
};

また、(うっかり)同じ値を指定をすることも出来るので、例えば 1 が First なのか First2 なのか、区別する方法がありません
運用で、「enum を追加する場合は必ず末尾に追加する」というのが一番安全でしょうか。

なお、Json に変換した場合も int になります。この値ズレ問題を起こす危険性がありますので気を付けましょう。

NewtonSoft の JsonConvert を使えば、[JsonConverter(typeof(StringEnumConverter))] 属性で enum を文字列保存することも可能なようです。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA