将枚举值传递给函数

时间:2012-09-14 16:34:14

标签: c# enums enumerators

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

例如,我非常希望能够定义这些(伪代码):

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++;
}

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

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

8 个答案:

答案 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);
    }

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

答案 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;
                    }