比较两个不同枚举的最佳方法是什么?

时间:2015-10-18 10:54:02

标签: c# enums

我在想什么是比较两个不同枚举值的最佳方式。

示例:

public enum ExampleEnumA
{
    ExampleValue
}

public enum ExampleEnumB
{
    ExampleValue
}

 if (ExampleEnumA.ExampleValue.ToString() == ExampleEnumB.ExampleValue.ToString())
 {

 }

比较字符串工作,但我知道它不是最有效和最敏捷的方式。如何做得更好?

修改

也许这是一个设计缺陷,但它是来自真实项目的问题,而不是我对枚举的错误理解。这就是它的样子,没有时间重构整个方法。

public interface IProvider
{
    Enum SectionType { get; }
}

public class FirstProvider : IProvider
{
    public Enum SectionType
    {
        get { return ExampleEnumA.ExampleValue; }
    }
}

public class SecondProvider : IProvider
{
    public Enum SectionType
    {
        get { return ExampleEnumB.ExampleValue; }
    }
}

public class Program
{
    public void TmpMethod(Enum sectionType)
    {
        var provider = GetFromIoC...

        if (provider.SectionType == sectionType)
        {
            //...
        }
    }
}

1 个答案:

答案 0 :(得分:7)

枚举就像一个基于整数的常规常量类的抽象层。

该抽象包括评估false,即使两个enumeraiton值是相同的整数但属于不同的枚举类型。

比较具有相同基础值的两种不同枚举类型的最佳方法是什么?如果您需要执行此评估,我会回答它应该是一个设计缺陷

例如,我们说我们已经实现了这些枚举:

public enum States
{
    Open = 1, 
    Closed
}

public enum SpecialFolders 
{
     ProgramFiles86 = 1,
     ProgramFiles64
}

States.Open == SpecialFolders.ProgramFiles86这样有意义吗?潜在地,它们似乎是平等的(它们不会),因为两个枚举值都具有1的基础值,但如果枚举类型不是&#,1并不意味着相同39; t相同。

这就像说......

  1. 面包
  2. ...与:

    相同
    1. (面包==偷窃????????????)
    2. 木材
    3. 也许......

      ...你可以打破输入常量的目的,因为枚举将它们转换为int

      if ((int)ExampleEnumA.ExampleValue == (int)ExampleEnumB.ExampleValue)
      {
      
      }
      

      ...如果基础类型是int。它也可以是long

      public enum SomeEnum : long 
      {
      }
      

      ...您需要将评估的左右部分投射到long,依此类推。

      无论如何,我坚持认为你不应该这样做。也许你应该使用常规的常量类,并且每次评估你都会避免2次强制转换:

      public static class States
      {
           public const int Open = 1;
           public const int Closed = 2;
      }
      
      public static class Materials
      {
          public const int Steel = 1;
          public const int Wood = 1;
      }
      
      // true! but not that true... I can't understand why these constants equal...
      if(States.Open == Materials.Wood)
      {
      }
      
      顺便说一句,我仍然认为这是一个设计缺陷,你应该避免使用枚举来解决一个糟糕的设计决策。