Передача перечисляемых значений в функции

Скажем, у меня есть функция, которая принимает целое число в качестве аргумента. Я хотел бы иметь возможность использовать перечислимый список как способ организации целочисленных значений.

Например, в идеале я бы хотел иметь возможность определить это (псевдокод):

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

Опять же, это будет работать, но просто кажется ужасно громоздким, когда у меня есть множество этих контейнерных классов для определения.

Ответ вполне может быть, что нет более простого пути, и что мне нужно быть взрослым и просто принять один из этих вариантов. Но я думал, что получу проверку здравомыслия, прежде чем совершать это. Есть ли третий вариант?

8 ответов

В чем ваша проблема?

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

DoSomething(Days.Monday);

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

Также обратите внимание на уже встроенный enum System.DayOfWeek.


Я получил точку зрения OP, но afaik это еще не поддерживается C#:

void DoSomething<T>(T e) where T : enum
{
    T next  = e + 1;
}

Вы можете перегружать свой метод, если вы действительно хотите получить значение int, возможно, что-то вроде этого?

int dosomething(enum x)
{return dosomething((int)x)}
int dosomething(int x)
{return x+1}

Если вы пытаетесь перегрузить функцию параметром:

int DoSomething(Enum1 value)
int DoSomething(Enum2 value)

Я потратил "немного" времени на это, потому что получил ту же проблему (решение). Итак, вот мое решение, которое отлично работает на (.NET 4), Windows Forms:

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;
                    }
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.Feb February);

рабочий код, как вы всегда передаете enum и тип int, вам просто нужно разобрать и отправить этот код отлично работает.. дайте мне знать

Да, вы можете сделать это

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.

Любая проблема с System.DateTime?

Это был бы самый прагматичный тип для использования.

Или, если вы не хотите изменять все существующие Enums:

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

как указано здесь: enums-returning-int-value

Другие вопросы по тегам