我在想什么是比较两个不同枚举值的最佳方法.
例:
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)
枚举就像一个基于整数的常规常量类的抽象层.
该抽象包括评估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如果枚举类型不相同则不同意.
这就像说......
...是相同的:
...你可以打败输入常量的目的,因为枚举将它们转换为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)
顺便说一句,我仍然认为这是一个设计缺陷,你应该避免使用枚举来解决一个糟糕的设计决策.