2

假设我有一个以整数作为参数的函数。我希望能够使用枚举列表来保持整数值的组织。

例如,理想情况下,我希望能够定义这些(伪代码):

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);

唯一的问题是这个函数在我的代码中被调用了很多地方,并且不得不一直将“(int)”放在所有地方是很笨拙的(将这些 int 值组合成枚举的主要动机之一首先是使代码更具可读性)。

另一种选择是完全避免枚举,而是将值捆绑到容器类中,例如:

static class Days
{
    static int x = 0;

    static int monday = x++;
    static int tuesday = x++;
}

同样,这会起作用,但是当我有很多这些容器类要定义时,这似乎非常麻烦。

答案很可能是没有更简单的方法,我需要成为一个成年人并接受其中一种选择。但我想我会在承诺之前对此进行全面检查。有第三种选择吗?

4

8 回答 8

2

你的问题是什么?

public enum Days : short
{
    Monday = 1,
    Tuesday = 2,
    ...
}

DoSomething(Days.Monday);

void DoSomething(Days day)
{
    Days nextDay = day + 1;
}

还要注意已经内置的枚举 System.DayOfWeek


我得到了 OP 的观点,但是 C# 还不支持这点:

void DoSomething<T>(T e) where T : enum
{
    T next  = e + 1;
}
于 2012-09-14T16:37:12.963 回答
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);

工作代码,因为你总是传递枚举并且它是 int 类型,你只需要解析和发送这个代码就可以完美地工作..让我知道

于 2012-09-14T17:18:55.333 回答
0

你可以重载你的方法,如果你真的只想要 int 值,也许是这样的?

int dosomething(enum x)
{return dosomething((int)x)}
int dosomething(int x)
{return x+1}
于 2012-09-14T16:47:38.757 回答
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;
                    }
于 2012-09-19T11:44:27.347 回答
0

或者,如果您不想更改所有现有枚举:

    public static int DoSomething(Enum x) 
    {
        int xInt = (int)Convert.ChangeType(x, x.GetTypeCode());
        DoSomething(xInt);
    }

如此处所述:enums-returning-int-value

于 2012-09-14T16:58:17.827 回答
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。

于 2012-09-14T16:37:15.927 回答
0

有什么问题System.DateTime吗?

这将是最实用的类型。

于 2012-09-14T16:37:24.777 回答
0

您是否尝试通过参数重载函数:

int DoSomething(Enum1 value)
int DoSomething(Enum2 value)
于 2012-09-14T17:16:52.627 回答