忽略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; 

请注意,其他任何人都可以做同样的事情。

使用#pragma禁用特定代码周围的警告怎么样?

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

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

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

我看到2个选项:

  • 当您将其用于分支逻辑时,将其映射到私有Enum。 你应该能够从一个直接投射到另一个。
  • 从int转换它,因此从不使用代码中的实际Enum值。

正如乔恩指出的那样,任何使用你的图书馆的人都可以和威尔(我知道你在哪里工作),无论如何都要破解它。

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

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

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

TheSoftwareJedi正确地指出,这不适用于过时的属性设置为错误。 以下“答案”仅在将过时通知作为警告引发时才有效。


从Visual Studio,您可以在每个项目的基础上执行此操作:

  1. 转到项目属性页面,以获取要禁止过时警告的项目。
  2. 转到“构建”选项卡:错误和警告:抑制警告
  3. 在这种情况下输入警告编号0612。

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