2

次のような列挙型があります。

public enum TransactionStatus { Open = 'O', Closed = 'C'};

そして、私はデータベースからデータを引き出しており、1 文字で (ご想像のとおり) 'O' トランザクションが開いているか、'C' トランザクションが閉じているかを示しています。

データはオブジェクトとしてデータベースから出てくるので、比較コードを書くのにかなりの時間を費やしています。

私ができる最善のことは、次のように書くことです。

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 から継承されていることを明確にすることはできますが、ポリモーフィックなものではありませんか?

4

4 に答える 4

4
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' };
于 2008-09-19T21:53:59.033 に答える
0

列挙型は一般に 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本当にオブジェクトかどうか、または文字列に安全にキャストできるかどうかを確認することもできます。

于 2008-09-19T21:16:22.320 に答える
-1

Enum.Parse を見てみましょう。char を解析して適切な列挙型に戻すことができます。C# 1.0 までずっと機能すると思います。コードは次のようになります。

TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());
于 2008-09-19T21:08:16.583 に答える
-2

値を比較する必要がある場合は、次のようなものを使用できます。

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
于 2008-09-19T21:29:33.973 に答える