読者です 読者をやめる 読者になる 読者になる

プログラマーな日々

プログラマーをやっています。好きなツール:WorkFlowy、好きな言語:C#、好きなサービス:Backlog、好きなAWS:AWS Lambda。

【.NET】型を指定してEnumにParseするParse<T>メソッドを書いてみた

.NET Enum

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);
        }
    }
}

結果

f:id:JHashimoto:20160813174733p:plain