我有一些int常量分组在几个枚举中,如:
enum myEnum{
OBJECT_A = 10, OBJECT_B = 13 };
现在我有几个函数可以使用这个枚举并执行某些操作,例如:
void myfunc(myEnum e)
{ .... }
在我的代码中,我需要以这两种方式使用myfunc:
myfunc(myEnum.OBJECT_A);
myfunc(13);
这会产生错误,因为ints不会隐式转换为Enum。
您认为最佳做法是什么,以保持代码的可读性?
一个明显的解决方案是使用myfunc((myEnum)13);但这很无聊,因为每次都需要转换int并且代码变得很重。
到目前为止,我所做的是(完全避免使用枚举):
using EChannelInt = System.Int32;
public static class EChannel
{
public static readonly int CH_CONNECTION = 10;
public static readonly int CH_DATA = 50;
}
public void doit(EChannelInt ch)
{ .... }
doit(EChannel.CH_DATA);
doit(10);
哪个有效,但我不太喜欢它,因为它似乎是一个"技巧"或重命名thigs。你有什么建议?也许"隐含算子"可能有用吗?
答案 0 :(得分:2)
您可以重载void myfunc(int i)
{
myfunc((myEnum)i);
}
:
myFunc
答案 1 :(得分:1)
您可以使用type-safe-enum模式,并且可以覆盖隐式强制转换运算符。
public class EChannel
{
public int Value {get; private set;};
public static readonly EChannel CH_CONNECTION = new EChannel(10);
public static readonly EChannel CH_DATA = new EChannel(50);
private EChannel(int value)
{
Value = value;
}
public static implicit operator EChannel(int a)
{
EChannel eChannel = null;
switch (a) // this need to be changed to something more light
{
case 10:
eChannel = CH_CONNECTION;
break;
case 50:
eChannel = CH_DATA;
break;
default:
throw new Exception("Constant don't exists");
}
return eChannel;
}
}
你就像这样使用它
public void doit(EChannel ch)
{ .... }
doit(EChannel.CH_DATA);
doit(10);
答案 2 :(得分:0)
答案 3 :(得分:0)
我会尽可能地使用枚举值,并且在绝对必要时(如果有的话)仅在狭窄的范围内强制转换为int
。
但是,如果你坚持混合整数和枚举值,那么你应该考虑从整数中定义enum
成员,以保证它们是一致的。
示例:
public static class EChannel
{
public const int CH_CONNECTION = 10;
}
public enum myEnum
{
CH_CONNECTION = EChannel.CH_CONNECTION
}