忽略ObsoleteAttribute编译器错误

问题描述:

我有一个枚举值用下面的属性标记。第二个参数指示编译器在使用该值时发生错误。我希望这种行为适用于实现我的库的任何人,但我需要在我的库中使用此枚举值。如何让编译器忽略库中几次使用的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; 
} 

私人单独不断某处是这样的:

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

我看到的是,您将这个公共枚举用于私有逻辑,并且在废弃它之后,您仍然需要内部逻辑。

我看到2个选项:

  • 它映射到当您使用它为您的分支逻辑的私人枚举。你应该能够从一个直投到另一个。
  • 从int中转换它,因此从不在代码中使用实际的Enum值。

正如乔恩在上面指出的那样,任何人使用你的图书馆都可以,而且(我知道你在哪里工作),无论如何只要通过它就能破解它。

+0

是的,他们会得到一个例外! (我控制代码的一个服务器组件会检查它。) – chilltemp 2008-12-05 20:28:06

TheSoftwareJedi正确地指出,这将无法使用过时的属性设置为一个错误。以下“答案”仅在过时的通知作为警告提出时才起作用。


从Visual Studio中,你可以做到这一点对每个项目的基础:

  1. 转到你希望能够抑制对过时的预警工程项目属性页。
  2. 转到生成选项卡:错误和警告:禁止警告
  3. 输入警告号码,0612在这种情况下。

其他项目将继续得到过时的警告,但这个项目不会。请注意,这将禁用所有过时的警告。

+0

根本问题是没有“正确的”答案。到目前为止,每个解决方案看起来都像是破解或者有自己的警告(或者两者兼有)。 – akmad 2008-12-05 18:12:54

它可能不是世界上最漂亮的解决方案,但您可以尝试通过将值分配给枚举然后在内部调用上投射来欺骗编译器。例如该应用程序运行:

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") 

我没有经验用过时的枚举,所以我会推荐一些相当不错的测试。

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

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

对访问者的说明,这只适用于类型和枚举成员。据我所知,这不适用于其他类型的成员(例如方法,属性等)。