概要
一回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
参考