2008-12-05 213 views
3

我有一個枚舉值用下面的屬性標記。第二個參數指示編譯器在使用該值時發生錯誤。我希望這種行爲適用於實現我的庫的任何人,但我需要在我的庫中使用此枚舉值。如何讓編譯器忽略庫中幾次使用的Obsolete錯誤。忽略ObsoleteAttribute編譯器錯誤

public enum Choices 
{ 
    One, 
    Two, 
    [ObsoleteAttribute("don't use me", true)] 
    Three, 
    Four 
} 

解決方案(謝謝大家)

public class EnumHack 
{ 
    static EnumHack() 
    { 
    // Safety check 
    if (Choices!= (Choices)Enum.Parse(typeof(Choices), "Three")) 
     throw new Exception("Choices.Three != 3; Who changed my Enum!"); 
    } 

    [Obsolete("Backwards compatible Choices.Three", false)] 
    public const Choices ChoicesThree = (Choices)3; 
} 

回答

2

私人單獨不斷某處是這樣的:

private const Choices BackwardsCompatibleThree = (Choices) 3; 

注意,其他人就可以做同樣的事情。

+0

看起來像我所有的選擇都是黑客。但是,無論如何,使用Obsolete屬性都是黑客行爲,因爲我希望將來可以重新啓用此功能。您以最快的答覆獲勝,易於實施,並且易於使用「FindAllReferences」進行跟蹤。 – chilltemp 2008-12-05 18:22:55

+0

chilltemp - 你吮吸... Jon不需要點!我距離接管世界只有30步!!!!! ;) – TheSoftwareJedi 2008-12-05 18:52:54

+1

如果你這樣做,它可能是一個好主意,把它標記爲[Obsolete] – 2008-12-05 19:10:22

1

我看到的是,您將這個公共枚舉用於私有邏輯,並且在廢棄它之後,您仍然需要內部邏輯。

我看到2個選項:

  • 它映射到當您使用它爲您的分支邏輯的私人枚舉。你應該能夠從一個直投到另一個。
  • 從int中轉換它,因此從不在代碼中使用實際的Enum值。

正如喬恩在上面指出的那樣,任何人使用你的圖書館都可以,而且(我知道你在哪裏工作),無論如何只要通過它就能破解它。

+0

是的,他們會得到一個例外! (我控制代碼的一個服務器組件會檢查它。) – chilltemp 2008-12-05 20:28:06

0

TheSoftwareJedi正確地指出,這將無法使用過時的屬性設置爲一個錯誤。以下「答案」僅在過時的通知作爲警告提出時才起作用。


從Visual Studio中,你可以做到這一點對每個項目的基礎:

  1. 轉到你希望能夠抑制對過時的預警工程項目屬性頁。
  2. 轉到生成選項卡:錯誤和警告:禁止警告
  3. 輸入警告號碼,0612在這種情況下。

其他項目將繼續得到過時的警告,但這個項目不會。請注意,這將禁用所有過時的警告。

+0

根本問題是沒有「正確的」答案。到目前爲止,每個解決方案看起來都像是破解或者有自己的警告(或者兩者兼有)。 – akmad 2008-12-05 18:12:54

1

它可能不是世界上最漂亮的解決方案,但您可以嘗試通過將值分配給枚舉然後在內部調用上投射來欺騙編譯器。例如該應用程序運行:

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TestMethod((Choices)3); 
     } 

     private static int TestMethod(Choices choice) { 
      return 1; 
     } 
    } 

    public enum Choices 
    { 
     One = 1, 
     Two = 2, 
     [ObsoleteAttribute("don't use me", true)] 
     Three = 3, 
     Four = 4 
    } 
} 

我認爲Enum.Parse會工作,但它得到一個運行時錯誤,所以不這樣做:

(Choices)Enum.Parse(typeof(Choices), "Choices.Three") 

我沒有經驗用過時的枚舉,所以我會推薦一些相當不錯的測試。

2

如何使用#pragma禁用特定代碼的警告?

#pragma warning disable 0612 
    // Call obsolete type/enum member here 
#pragma warning restore 0612 

對訪問者的說明,這隻適用於類型和枚舉成員。據我所知,這不適用於其他類型的成員(例如方法,屬性等)。