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

Adr*_*rek 0 c# enums

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

例:

public enum ExampleEnumA
{
    ExampleValue
}

public enum ExampleEnumB
{
    ExampleValue
}

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

 }
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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)
        {
            //...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*zer 7

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

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

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

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

public enum States
{
    Open = 1, 
    Closed
}

public enum SpecialFolders 
{
     ProgramFiles86 = 1,
     ProgramFiles64
}
Run Code Online (Sandbox Code Playgroud)

会有意义States.Open == SpecialFolders.ProgramFiles86吗?潜在地,它们似乎是相等的(它们不会),因为两个枚举值都具有基础值1,但1如果枚举类型不相同则不同意.

这就像说......

  1. 面包

...是相同的:

  1. (面包==偷?????????????)

也许...

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

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

}
Run Code Online (Sandbox Code Playgroud)

......如果基础类型是int.它也可能是long:

public enum SomeEnum : long 
{
}
Run Code Online (Sandbox Code Playgroud)

...并且您需要将评估的左右部分投射到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)
{
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我仍然认为这是一个设计缺陷,你应该避免使用枚举来解决一个糟糕的设计决策.