0

私はこの列挙型を持っています:

enum OptionalityEnum { call = 'C', put = 'P', undefined = 'N' }

char を列挙型に変換する簡単な方法はありますか? これは機能します:

char chOpt = 'C';
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = OptionalityEnum.call

しかし、私の char が列挙に存在しない値である場合、これは奇妙な結果をもたらします。

char chOpt = 'X';
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = 88

Enum 関数のいくつかについては知っていますが、この変換を行う関数が見つかりません。

Enum.GetNames(typeof(OptionalityEnum)) = { call, na, put }
Enum.GetValues(typeof(OptionalityEnum)) = { call, na, put }
Enum.TryParse<OptionalityEnum>("C", out optionality) = false

Enum.TryParse<OptionalityEnum>("call", out optionality) = true 
  //... but that's not what I want.

Enum.IsDefined(typeof(OptionalityEnum), "call") = true
  //... but that's not what I want.

独自のコンバーターを作成する必要がありますか? このようなもの?

private static OptionalityEnum Convert(char ch) { OptionalityEnum 結果 = (OptionalityEnum)ch; if (Enum.IsDefined(typeof(OptionalityEnum), result)) 結果を返します。それ以外の場合は、OptionalityEnum.undefined を返します。}

private static bool TryConvert(char ch, out OptionalityEnum opt)
{
    opt = (OptionalityEnum)ch;
    return Enum.IsDefined(typeof(OptionalityEnum), opt);
}

これは機能しますが、ずさんなようです。このようなものがまだ存在しないとしたら、私は驚くでしょう。

編集:私はもともと自分のConvert機能に悪い例を使用していました。関数に変更しましたTryConvert

4

1 に答える 1

2

あなたの「ずさんな」ソリューションは、私には完全に適切に思えます。デフォルトで「未定義」になるものは他にありません。条件演算子を使用すると、少しきれいになります。

private static OptionalityEnum Convert(char ch)
{
    OptionalityEnum result = (OptionalityEnum)ch;
    return Enum.IsDefined(typeof(OptionalityEnum), result)
        ? result : OptionalityEnum.undefined;
}

編集:TryConvertメソッドについては、実際に存在しない場合に設定optすることを確認します。default(OptionalityEnum)

しかし、いいえ、これがフレームワークに存在するとは思いません。ただし、少なくともボクシングを回避する拡張メソッドを使用できる私のUnconstrained Melodyプロジェクトを見たいと思うかもしれません。IsNamedValue

于 2013-06-21T15:29:16.477 に答える