Получить максимальное значение из enum, используя дженерики - PullRequest
4 голосов
/ 05 июня 2019

Как я могу получить максимальное значение int из перечисления, используя обобщенные значения?

Я пробовал следующее, однако он отображает следующую ошибку компиляции:

Невозможно неявно преобразовать T в int

    int maxValue = GetMaxValue<SomeEnum>(typeof(SomeEnum)); //expecting 2

    private static int GetMaxValue<T>(Type enumType)
    {
        return Enum.GetValues(enumType).Cast<T>().Max();
    }

    public enum SomeEnum
    {
        ValueOne = 1,
        Value = 2
    }

Ответы [ 3 ]

3 голосов
/ 05 июня 2019

В случае C # 7.3 или более поздней версии вы можете реализовать Sweeper's идею немного по-другому (с помощью ограничения where T : Enum):

public static T GetMaxValue<T>() where T : Enum {
  return Enum.GetValues(typeof(T)).Cast<T>().Max();
}

...

SomeEnum max = GetMaxValue<SomeEnum>();

Обратите внимание, что результатом является enum само по себе, и поэтому у нас нет проблем с базовым типом enum (byte, short int, long)

2 голосов
/ 05 июня 2019

Вам нужно привести к int, а не T. И вам на самом деле не нужен параметр Type (если вы не знаете тип во время компиляции), так как вы можете просто сделать typeof(T):

private static int GetMaxValue<T>()
{
    return Enum.GetValues(typeof(T)).Cast<int>().Max();
}

// usage:
GetMaxValue<SomeEnum>() // 2

Если ваши перечисления имеют long или какой-либо другой тип в качестве базового типа, вы можете указать другой параметр типа для приведения их к:

private static U GetMaxValue<T, U>() where U : struct
{
    return Enum.GetValues(typeof(T)).Cast<U>().Max();
}

// usage:
GetMaxValue<SomeLongEnum, long>()
0 голосов
/ 05 июня 2019

Использование Convert.ToInt32

 return Convert.ToInt32(Enum.GetValues(enumType).Cast<T>().Max());

Но обычно я делаю это быстрее, чем вызов GetValues ​​

public enum SomeEnum
{
    ValueOne = 1,
    Value = 2,
    END
}

return (int)(SomeEnum.END - 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...