1

(vb).NET で文字列型を列挙する方法を探していましたが、.NET 列挙型は数値型の値しか受け入れません。

私が見つけた最初の代替手段は、列挙値と返したい文字列の辞書を作成することでした。これは機能しましたが、列挙型を変更すると、辞書も変更することを覚えておく必要があるため、維持するのが困難でした。

2 番目の方法は、各列挙メンバーにフィールド属性を設定し、リフレクションを使用して取得することでした。確かにこれはうまく機能し、メンテナンスの問題も解決しましたが、リフレクションを使用しており、リフレクションの使用は最後の手段であるべきだといつも読んでいます。

そこで私は考え始め、これを思いつきました: すべての ASCII 文字は 16 進値として表すことができ、16 進値を列挙メンバーに割り当てることができます。属性を取り除き、16 進数の値を列挙メンバーに割り当てることができます。次に、テキスト値が必要な場合は、値をバイト配列に変換し、使用 System.Text.Encodings.ASCII.GetString(enumMemberBytes)して文字列値を取得します。

経験から言えば、私が思いつくものは通常、欠陥があるか、単に間違っているだけです。皆さんは、このアプローチについてどう思いますか? そのようにしない理由はありますか?

ありがとう。

編集

David W が指摘したように、列挙型メンバーの値は、基になる型 (既定では整数) に応じて長さが制限されます。そうです、私の方法はうまくいくと思いますが、整数または長整数をそれぞれ使用して最大長が 4 または 8 文字のASCII テーブルの文字に制限されています。

4

1 に答える 1

1

列挙型の文字列表現を実際の列挙型に動的に解析する最も簡単な方法は、次のようにすることでした。

Private EnumObject
     [Undefined]
     ValueA
     ValueB
End Enum

dim enumVal as EnumObject = DirectCast([Enum].Parse(GetType(EnumObject), "ValueA"), EnumObject)

これにより、辞書を維持する必要がなくなり、Int または Long に変換する代わりに、文字列を処理するだけで済みます。これはリフレクションを使用しますが、文字列解析で例外をキャッチして処理する限り、問題は発生していません。

于 2012-04-24T21:25:18.557 に答える