Enum.Parseを使って、文字列をEnumにParseするには以下のように書きます。
(Creature) Enum.Parse(typeof(Creature), "Human");
型を2回指定するのが面倒なので、型を指定してEnumにParseするParse<T>メソッドを書いてみました。
ソースコード
using System; namespace JHashimoto.Infrastructure.Enumeration { public static class EnumUtility { /// <summary> /// 列挙定数の名前または数値の文字列形式を、等価の列挙オブジェクトに変換します。 /// </summary> /// <typeparam name="T">列挙型。</typeparam> /// <param name="value">変換する名前または値が含まれている文字列。</param> /// <returns>値が<paramref name="value"/>により表される<typeparamref name="T"/>型のオブジェクト。</returns> /// <remarks>この演算では、大文字と小文字が区別されます。</remarks> public static T Parse<T>(string value) where T : struct { return (T) EnumUtility.Parse<T>(value, ignoreCase: false); } /// <summary> /// 列挙定数の名前または数値の文字列形式を、等価の列挙オブジェクトに変換します。 /// 演算で大文字と小文字を区別するかどうかをパラメーターで指定します。 /// </summary> /// <typeparam name="T">列挙型。</typeparam> /// <param name="value">変換する名前または値が含まれている文字列。</param> /// <param name="ignoreCase">大文字と小文字を区別しない場合は true。大文字と小文字を区別する場合は false。 </param> /// <returns>値が<paramref name="value"/>により表される<typeparamref name="T"/>型のオブジェクト。</returns> public static T Parse<T>(string value, bool ignoreCase) where T : struct { return (T) Enum.Parse(typeof(T), value, ignoreCase); } } }
使い方
以下のように使います。
namespace EnumSample { public enum Creature : int { Dog, Rat, Human } }
using EnumSample; using JHashimoto.Infrastructure.Enumeration; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; namespace EnumTest { [TestClass] public class UnitTest1 { [TestMethod] public void Parse成功() { Creature creature = EnumUtility.Parse<Creature>("Human"); Assert.AreEqual(Creature.Human, creature); } [TestMethod] [ExpectedException(typeof(ArgumentException))] public void Parse失敗() { Creature creature = EnumUtility.Parse<Creature>("Cat"); } [TestMethod] [ExpectedException(typeof(ArgumentException))] public void Parse失敗_大文字小文字() { Creature creature = EnumUtility.Parse<Creature>("hUMAN"); } [TestMethod] public void Parse成功_大文字小文字無視_IgnoreCase指定あり() { Creature creature = EnumUtility.Parse<Creature>("hUMAN", ignoreCase: true); Assert.AreEqual(Creature.Human, creature); } [TestMethod] public void Parse成功_大文字小文字_IgnoreCase指定あり() { Creature creature = EnumUtility.Parse<Creature>("Human", ignoreCase: false); Assert.AreEqual(Creature.Human, creature); } [TestMethod] [ExpectedException(typeof(ArgumentException))] public void Parse失敗_大文字小文字_IgnoreCase指定あり() { Creature creature = EnumUtility.Parse<Creature>("hUMAN", ignoreCase: false); } } }
結果