代码之家  ›  专栏  ›  技术社区  ›  chilltemp

忽略过时的属性编译器错误

c#
  •  4
  • chilltemp  · 技术社区  · 16 年前

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

    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 回复  |  直到 16 年前
        1
  •  2
  •   Jay Bazuzi Buck Hodges    16 年前

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

    private const Choices BackwardsCompatibleThree = (Choices) 3;
    

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

        2
  •  2
  •   davenpcj    16 年前

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

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

    请注意,这仅适用于类型和枚举成员。据我所知,这不适用于其他类型成员(例如方法、属性等)。

        3
  •  1
  •   TheSoftwareJedi jac    16 年前

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

    我看到两个选项:

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

    正如Jon上面指出的那样,任何使用你的库的人都可以,也会(我知道你在哪里工作),无论如何都可以破解它。

        4
  •  1
  •   Ryan Cook    16 年前

    这可能不是世界上最漂亮的解决方案,但你可以通过给枚举赋值,然后对内部调用进行强制转换来欺骗编译器。例如,此应用程序运行:

    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。解析可以工作,但会出现运行时错误,所以不要这样做:

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

    我没有使用过时枚举的经验,所以我建议对此进行一些很好的测试。

        5
  •  0
  •   akmad    16 年前

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


    在Visual Studio中,您可以按每个项目执行此操作:

    1. 转到您希望能够抑制过时警告的项目的“项目属性”页面。
    2. 转到“构建”选项卡:错误和警告:抑制警告
    3. 在本例中输入警告号0612。

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