char Enumとchar boxedをオブジェクトと比較するヘルパーメソッドが必要です
質問
次のような列挙型があります。
public enum TransactionStatus { Open = 'O', Closed = 'C'};
そして、ご想像のとおり、'O' トランザクションが開いているか、'C' トランザクションが閉じているかを示す 1 文字でデータベースからデータを取得しています。
データがオブジェクトとしてデータベースから取得されるため、比較コードを書くのに非常に時間がかかっています。
私にできる最善のことは次のように書くことです。
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
return ((char)enum_status).ToString() == obj_status.ToString();
}
ただし、対処しなければならない文字列挙型はこれだけではありません。5 つまたは 6 つあり、それらに対して同じメソッドを記述するのは、控えめに言っても面倒です。 おそらくすべての列挙型は System.Enum から継承します しかし、それを入力タイプとして設定しようとすると、コンパイルエラーが発生します。これは .NET 1.1 にも含まれているため、ジェネリックスは問題外です。
私はしばらくこれに苦労してきました。誰かがこのメソッドを書くより良い方法を持っていますか?また、列挙型全体が System.Enum から継承しているが、多態性のものではないことを誰かが明確にすることができますか?
解決
static void Main(string[] args)
{
object val = 'O';
Console.WriteLine(EnumEqual(TransactionStatus.Open, val));
val = 'R';
Console.WriteLine(EnumEqual(DirectionStatus.Left, val));
Console.ReadLine();
}
public static bool EnumEqual(Enum e, object boxedValue)
{
return e.Equals(Enum.ToObject(e.GetType(), (char)boxedValue));
}
public enum TransactionStatus { Open = 'O', Closed = 'C' };
public enum DirectionStatus { Left = 'L', Right = 'R' };
他のヒント
C# では列挙型は一般に乱雑なので、.NET 2.0 を使用する場合は、そのようなぎこちないコードを記述する必要がないように構文をジェネリックでラップするのが一般的です。
.NET 1.1 では、次のようなことを行うことができますが、元のスニペットよりもはるかに整然としたものではありません。
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status)
{
return (enum_status == Enum.Parse(typeof(TransactionStatus), obj_status.ToString()));
}
これはほぼ同じ量のコードですが、文字列比較ではなく列挙型比較を行っています。
デバッガー/ドキュメントを使用して、次のことを確認することもできます。 obj_status
本当にオブジェクトなのか、安全に文字列にキャストできるのかどうか。
Enum.Parse を見てみましょう。これにより、文字を解析して適切な列挙型に戻すことができます。C# 1.0 まで遡って動作すると思います。コードは次のようになります。
TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());
値を比較するだけの場合は、次のようなものを使用できます。
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
return (char)enum_status == (char)obj_status;
}