1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C# のジェネリック制約にEnumを使う時のサンプル

Posted at

概要

一回C#のジェネリック制約にEnumを使ってみたけどあんまりパッとしなかったのでサンプルをいくつか書いてみました。
大量のEnumパラメータから自動でドロップダウンリストUIを生成したいみたいな用途で使うことを想定しています。
ただstring↔Tenumの相互変換があまりスマートではないのでいい方法があるならコメントで教えてくれると大変うれしいです。

コード

using System;

namespace SnippetTest
{
    public class Program
    {
        static void Main(string[] args)
        {
            var test = new EnumGenericTest<SampleEnum>();
            var sample = SampleEnum.Two;
            var sample2 = SampleEnum.Three;
            var sample3 = SampleEnum.Two;

            test.EnumTest(sample);

            Console.WriteLine($"TEnumを比較する,(sample == sample2) = {test.EnumEqual(sample, sample2)}");
            Console.WriteLine($"TEnumを比較する,(sample == sample3) = {test.EnumEqual(sample, sample3)}");

        }

        enum SampleEnum
        {
            One, Two, Three
        }
    }

    public class EnumGenericTest<TEnum> where TEnum : struct, Enum
        //struct制約を付けないとEnum.TryParseが使えなかった(CS0453)
    {

        public string EnumFullName { get; private set; }
        public string EnumName { get; private set; }

        public int EnumValue { get; private set; }

        public EnumGenericTest()
        {
            Console.WriteLine($"型Check: IsEnum=={typeof(TEnum).IsEnum}");

            foreach(string name in Enum.GetNames(typeof(TEnum)))
            {
                Console.WriteLine($"要素名列挙:{name}");
            }
            //実際にObjectを列挙したいときはEnum.GetValues()を使う
        }

        public void EnumTest(TEnum enumValue)
        {
            //クラス名含めてFullで型名を取る
            EnumFullName = typeof(TEnum).FullName;
            EnumName = typeof(TEnum).Name;

            EnumValue = Convert.ToInt32(enumValue);


            Console.WriteLine($"型名をFullで:{EnumFullName}");
            Console.WriteLine($"列挙型単体で型名を:{EnumName}");
            Console.WriteLine($"整数で値を出力する:{enumValue}");
            //Enum制約状態でstring-> EnumObjectへの変換
            if (Enum.TryParse<TEnum>("One", out var result))
            {
                Console.WriteLine($"StringをEnumにPurseする{result},intValue={Convert.ToInt32(result)}");
            }
        }

        public bool EnumEqual(TEnum enumValue1, TEnum enumValue2)
        {
            return Enum.Equals(enumValue1, enumValue2);
        }
    }
}

Output

型Check: IsEnum==True
要素名列挙:One
要素名列挙:Two
要素名列挙:Three
型名をFullで:SnippetTest.Program+SampleEnum
列挙型単体で型名を:SampleEnum
整数で値を出力する:Two
StringをEnumにPurseするOne,intValue=0
TEnumを比較する,(sample == sample2) = False
TEnumを比較する,(sample == sample3) = True

参考

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?