忽略ObsoleteAttribute编译器错误

时间:2008-12-05 17:44:09

标签: c#

我有一个用以下属性标记的枚举值。每当使用该值时,第二个参数指示编译器发生错误。我希望这个行为适用于实现我的库的任何人,但我需要在我的库中使用这个枚举值。如何告诉编译器忽略我的库中几次使用的过时错误。

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;
}

5 个答案:

答案 0 :(得分:2)

私有一个单独的常量,如下所示:

private const Choices BackwardsCompatibleThree = (Choices) 3;

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

我看到两个选项:

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

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

答案 3 :(得分: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")

我没有过时枚举的经验,所以我建议一些相当不错的测试。

答案 4 :(得分:0)

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


从Visual Studio中,您可以基于每个项目执行此操作:

  1. 转到您希望能够取消过时警告的项目的“项目属性”页面。
  2. 转到“构建”选项卡:“错误和警告:抑制警告”
  3. 在这种情况下输入警告编号0612。
  4. 其他项目将继续获得过时警告,但此项目不会。请注意,这将禁用所有过时警告。