假设我有一个以整数作为参数的函数。我希望能够使用枚举列表来保持整数值的组织。
例如,我非常希望能够定义这些(伪代码):
public enum days
{
monday,
tuesday,
etc...
}
public enum months
{
january,
february,
etc...
}
int doSomething(enum x)
{
return x + 1;
}
然后能够使用以下任一枚举列表调用该函数:
int a = doSomething(days.monday);
int y = doSomething(months.february);
这显然不会按原样运作,因为需要使用其中一个枚举(即天或月)来定义doSomething。我知道几个选项。一种是简单地转换为int:
int a = doSomething((int)days.monday);
int y = doSomething((int)months.february);
这个问题的唯一问题是这个函数在我的代码中被调用了很多地方,并且必须继续把#34;(int)" s放在一起(一个地方)首先将这些int值组合到枚举中的主要动机是使代码更具可读性。
另一种选择是完全避免使用枚举,而是将值捆绑到容器类中,例如:
static class Days
{
static int x = 0;
static int monday = x++;
static int tuesday = x++;
}
同样,这将起作用,但是当我有很多这些容器类要定义时,这看起来非常麻烦。
答案很可能是没有更简单的方法,我需要成年人才能接受其中一种选择。但我认为在承诺之前我会对它进行健全检查。有第三种选择吗?
答案 0 :(得分:2)
你的问题是什么?
public enum Days : short
{
Monday = 1,
Tuesday = 2,
...
}
DoSomething(Days.Monday);
void DoSomething(Days day)
{
Days nextDay = day + 1;
}
另请注意already built-in enum System.DayOfWeek。
我得到了OP的观点,但afaik尚未得到C#的支持:
void DoSomething<T>(T e) where T : enum
{
T next = e + 1;
}
答案 1 :(得分:0)
是的,你可以这样做
public enum days : int
{
monday,
tuesday,
...
}
自动星期一变为0,星期二变为1,依此类推
public enum months : int
{
january,
february,
...
}
几个月相同
int doSomething(Enum x)
{
return (int)x + 1;
}
并将其命名为
int a = doSomething(days.monday);
或将其称为
int a = doSomething(months.january);
现在days.monday equals 0
,方法a
变为1。
答案 2 :(得分:0)
System.DateTime
有什么问题吗?
这将是最实用的类型。
答案 3 :(得分:0)
你可以重载你的方法,如果你真的只想要int值,也许这样吗?
int dosomething(enum x)
{return dosomething((int)x)}
int dosomething(int x)
{return x+1}
答案 4 :(得分:0)
或者,如果您不想更改所有现有的枚举:
public static int DoSomething(Enum x)
{
int xInt = (int)Convert.ChangeType(x, x.GetTypeCode());
DoSomething(xInt);
}
答案 5 :(得分:0)
您试图通过参数重载函数:
int DoSomething(Enum1 value)
int DoSomething(Enum2 value)
答案 6 :(得分:0)
public enum days : int
{ monday, tuesday,
}
public enum months :int
{ january, february, march,
}
public int doSomething(int z)
{
return z + 1;
}
//你的调用方法int c = ee.doSomething((int)testenums.months.march); int c = ee.doSomething((int)testenums.day.February);
工作代码因为你总是传递枚举,而且你只需要解析并且发送这段代码就完全有效了..让我知道
答案 7 :(得分:0)
我花了一点时间,因为得到了同样的问题(解决方案)。 所以这是我的解决方案,可以在(.NET 4),Windows窗体上正常工作:
VB:NET
Private Function DoSomething(Of TEnum As {IComparable, IConvertible, IFormattable})(ByVal valueEnum As TEnum) As Int32
Dim i As Int32 = CInt(Convert.ChangeType(valueEnum, valueEnum.GetTypeCode()))
//Do something with int
i += 1
Return i
End Function
C#
private int DoSomething<TEnum>(TEnum valueEnum) where TEnum: IComparable, IConvertible, IFormattable
{
int i = 0;
i = (int)Convert.ChangeType(valueEnum, valueEnum.GetTypeCode());
i++;
return i;
}