比较两个不同枚举的最佳方法是什么?
本文关键字:枚举 最佳 方法 是什么 两个 比较 | 更新日期: 2023-09-27 18:18:08
我在想比较两个不同枚举值的最佳方法是什么
的例子:
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)
{
//...
}
}
}
枚举就像是在基于整数的常量的常规类之上的抽象层。
该抽象包括计算false
,即使两个枚举值是相同的整数,但属于不同的枚举类型。
比较具有相同底层值的两种不同枚举类型的最佳方法是什么?我的回答是,如果需要执行这个求值,那么应该是一个设计缺陷。
例如,假设我们实现了以下枚举:public enum States
{
Open = 1,
Closed
}
public enum SpecialFolders
{
ProgramFiles86 = 1,
ProgramFiles64
}
像States.Open == SpecialFolders.ProgramFiles86
这样有意义吗?潜在地,它们看起来是相等的(它们不会),因为两个枚举值都有一个潜在的值1
,但是如果枚举类型不相同,1
并不意味着相同。
这就像在说……
- 面包
…与
相同- (偷面包= =偷窃 ????????????) 木头
也许…
…您可以破坏将常量作为枚举类型键入的目的,将它们强制转换为int
:
if ((int)ExampleEnumA.ExampleValue == (int)ExampleEnumB.ExampleValue)
{
}
…如果底层类型是int
。也可以是long
:
public enum SomeEnum : long
{
}
…并且需要将计算的左右部分强制转换为long
,等等。
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)
{
}
顺便说一句,我仍然认为这是一个设计缺陷,你应该避免不使用枚举来解决一个糟糕的设计决策。