2012-04-27 59 views
3

在我的代碼使用許多小枚舉:Eazfuscator.NET休息Enum.IsDefined

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

我經常需要將其轉換爲這個枚舉之前驗證整數輸入。

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

當枚舉使用FlagsAttribute時,此方法不起作用; Enum.IsDefined不能自動組合標誌來制定指定的值。不過,我已經能夠解決不需要FlagsAttribute。

但是,TIL Eazfuscator.NET的混淆打破了Enum.IsDefined。我知道這是可能的,但我希望它不會,因爲它不在System.Reflection命名空間中(據報道,它大量使用System.Reflection)。

所以我想知道如果有人知道任何好的選擇。我具體如下:

  1. 允許檢查整數是否在指定的枚舉。
  2. 與.NET Framework 2.0和Mono Framework兼容。
  3. 在不顯式禁用混淆的情況下使用混淆(使用屬性或某種GUI工具)。
+2

有關於「Eazfuscator打破我的代碼」的常見問題。通常與「他們沒有迴應」。拋棄它。 – 2012-04-28 00:21:35

+0

@HansPassant IIRC,我用過的其他一些混淆器不會中斷Enum.IsDefined(),但我不會責怪Eazfuscator。我可能會採取一種解決方案,涉及我認爲所謂的'enum guard'。這個想法是你做這樣的事情: enum UserRequests:字節{Burp = 0,Sneeze = 1,Fart = 2,MAXVAL = 3} 您可以通過比較來檢查指定的整數是否在標誌中MAXVAL。 – 2012-04-28 00:27:54

+0

嘗試[Crypto Obfuscator](http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm)。它對於基於枚舉的場景有一些智能的自動排除規則。免責聲明:我爲Crypto Obfuscator的開發商LogicNP Software工作。 – logicnp 2012-08-09 09:20:20

回答

2

如果其他人遇到同樣的問題,並找到這篇文章,我去的解決方案是爲每個枚舉添加一個額外的枚舉成員。

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

這是一個做法我記得使用C((非ANSI)與#define語句)遍歷枚舉值,它唯一的缺點是,它很難維持。

我寫了一個通用函數來減輕負擔(標題如下所示);我仍然必須明確地通過MAXVAL成員,但是它的工作比我想象的要少。當然,它仍然存在混淆並且便攜。

public static bool TryParseByteToEnum<T>(byte input_byte, 
    out T enum_member, T max_value) where 
     T : struct, IConvertible