Enumの種類が増えてきた場合に、その都度変換処理を追加するのが大変(面倒)だったので
ジェネリクスを利用して、文字列を<T>に指定したenum に変換するユーティリティクラスを作成しました。
こちらがソースです。(Githubも同じです)
https://github.com/mitsuruyamaura/ConvertEnumType
using System;
/// <summary>
/// string => enumへの変換用クラス
/// </summary>
public class ConvertEnumType {
/// <summary>
/// stringを指定したタイプのEnumに変換する
/// </summary>
public static IEnum FromString<IEnum>(string str) where IEnum : struct {
return (IEnum)Enum.Parse(typeof(IEnum), str, true);
}
}
ポイントとしましては、
・変換メソッドの呼び出し時、Enum.Parseのように2回同じEnumの種類を指定する必要がないこと。
・文字列の大文字・小文字の区別なくEnumに変換できること。
・文字列をEnumに変換して配列・リストにする場合にはLinqを使うと1行で書けること
などでしょうか。whereでIEnumを指定していますが、構造体(struct)だと入ってしまうため注意が必要です。
とはいえ、これは戻り値のある処理ですので、左辺の値が戻る値と異なる場合にはコンパイル出来ずにエラーが出ます。使用間違いはないでしょう。
これを踏まえて、サンプルクラスを作成してみます。
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class EnumTest : MonoBehaviour {
// Test用にEnumを3種類用意
public enum TIME_TYPE {
MORNING,
AFTERNOON,
EVENING,
NIGHT,
}
public enum DAY_TYPE {
SUNDAY,
MANDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
public enum SEASON_TYPE {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
// Debug用にpublicで。インスペクター上で確認できるように
public DAY_TYPE dayType;
public TIME_TYPE[] timeTypeArray;
public List<SEASON_TYPE> seasonTypeList = new List<SEASON_TYPE>();
// 使用例
void Start() {
// 文字列を引数で渡した種類のEnumに変換
string day = "friday";
dayType = ConvertEnumType.FromString<DAY_TYPE>(day);
// 配列用に文字列を用意
string times = "NIGHT,afternoon,Morning";
// この1行で上記のEnum.Parseと配列化が出来る(Select(x => (x))の引数は省略できます)
timeTypeArray = times.Split(',').Select(ConvertEnumType.FromString<TIME_TYPE>).ToArray();
// Listの場合も同じ
// List用に文字列を用意して、変換
string seasons = "summer,Winter,spring,AUTUMN";
seasonTypeList = seasons.Split(',').Select(ConvertEnumType.FromString<SEASON_TYPE>).ToList();
}
}
こちらが実行前。
こちらが実行後です。
いままでJsonで取得した文字列をEnum化して配列にする際は、以下のように書いていましたので、今回のメソッドを用意することで、処理も非常にすっきりしました。
// 配列用に文字列を用意
string times = "NIGHT,afternoon,Morning";
// 文字列を分割して、stringの配列を作成
string[] strArray = timeArray.Split(',').ToArray();
// Enum用の配列を初期化
timeTypeArray = new TIME_TYPE[strArray.Length];
// stringの配列をEnumに変換して配列に(Linq使わない場合)
for (int i = 0; i < strArray.Length; i++) {
timeTypeArray[i] = (TIME_TYPE)Enum.Parse(typeof(TIME_TYPE), strArray[i]);
}
以上になります。
なおこちらは、teratailにて私が質問・作成させて頂いたものを、改めて作りなおしたものです。