Передача перечисляемых значений в функции
Скажем, у меня есть функция, которая принимает целое число в качестве аргумента. Я хотел бы иметь возможность использовать перечислимый список как способ организации целочисленных значений.
Например, в идеале я бы хотел иметь возможность определить это (псевдокод):
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