3

私のコードでは、多くの小さな列挙型を利用しています。

enum UserRequest : byte { Burp=1, Sneeze=2, Fart=3 }

この列挙型に変換する前に、整数入力を検証する必要があることがよくあります。

bool valid_input = Enum.IsDefined(typeof(UserRequest), user_byte_value);

列挙型が FlagsAttribute を使用する場合、このアプローチは機能しません。Enum.IsDefinedは、フラグを自動的に組み合わせて指定された値を作成することはできません。ただし、FlagsAttribute を必要としないことを回避できました。

ただし、Eazfuscator.NETの難読化によって Enum.IsDefined が壊れる TIL。可能性があることはわかっていましたが、System.Reflection 名前空間にないため、そうならないことを望んでいました (報告によると、System.Reflection を多用しています)。

だから、誰かが良い代替案を知っているかどうか疑問に思っています。私は特に次のことを求めています。

  1. 整数が指定された列挙に含まれているかどうかを確認できます。
  2. .NET Framework 2.0 および Mono Framework と互換性があります。
  3. (属性または何らかの GUI ツールを使用して) 明示的に無効にすることなく、難読化を存続させます。
4

1 に答える 1

2

他の人がこの同じ問題に遭遇し、この記事を見つけた場合、私が行った解決策は、各列挙型に追加の列挙型メンバーを追加することでした。

enum UserRequests : byte
{
    Burp = 0,
    Sneeze = 1,
    Fart = 2,
    /* Maximum Valid Value */
    MAXVAL = Fart
}

これは、列挙値を反復処理するために C ((非 ANSI) with #defines) で使用したことを覚えている方法です。唯一の欠点は、維持が難しいことです。

負担を軽減するために一般的な関数を作成しました (以下に示すヘッダー)。MAXVAL メンバーを明示的に渡す必要がありますが、思ったより手間がかかりません。そしてもちろん、難読化に耐え、移植可能です。

public static bool TryParseByteToEnum<T>(byte input_byte, 
    out T enum_member, T max_value) where 
        T : struct, IConvertible
于 2012-04-28T22:20:38.357 に答える