我在想什么是比较两个不同枚举值的最佳方式。
示例:
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)
{
//...
}
}
}
答案 0 :(得分:7)
枚举就像一个基于整数的常规常量类的抽象层。
该抽象包括评估false
,即使两个enumeraiton值是相同的整数但属于不同的枚举类型。
比较具有相同基础值的两种不同枚举类型的最佳方法是什么?如果您需要执行此评估,我会回答它应该是一个设计缺陷。
例如,我们说我们已经实现了这些枚举:
public enum States
{
Open = 1,
Closed
}
public enum SpecialFolders
{
ProgramFiles86 = 1,
ProgramFiles64
}
像States.Open == SpecialFolders.ProgramFiles86
这样有意义吗?潜在地,它们似乎是平等的(它们不会),因为两个枚举值都具有1
的基础值,但如果枚举类型不是&#,1
并不意味着相同39; t相同。
这就像说......
...与:
相同 ...你可以打破输入常量的目的,因为枚举将它们转换为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)
{
}
顺便说一句,我仍然认为这是一个设计缺陷,你应该避免使用枚举来解决一个糟糕的设计决策。