Существует несколько ситуаций, когда я хочу иметь значения перечислимых значений IEnumerable<MyEnum>
. Код, который я обычно использую выглядит следующим образом:Есть ли лучший способ перечислить значения enum, чем Enum.GetValues ()?
Enum.GetValues(typeof(MyEnum)).OfType<MyEnum>()
Но не только это не очень красиво смотреть на большинство людей потребуется несколько секунд, чтобы понять, что он делает. Это также огромная боль, чтобы писать, особенно когда вам это нужно несколько раз в течение всего кода.
Чтобы сделать свою жизнь проще, я решил написать метод расширения, как это:
public static IEnumerable<T> GetValues<T>(this T e) where T : Enum
{
return Enum.GetValues(typeof(T)).OfType<T>();
}
За исключением я должен избавиться от where T : Enum
части, потому что "Constraint не может быть специальный класс«Enum ' ". Кроме того, это не совсем то, что я хочу, потому что вместо MyEnum.GetValues()
мне нужно будет написать MyEnum.Value.GetValues()
, что довольно запутанно и не очень красиво.
Что приводит меня к этому вопросу: есть ли лучший способ получить значения перечисления IEnumerable<MyEnum>
, чем с помощью Enum.GetValues()
?
У меня действительно нет другого выбора, кроме как сделать это Helper.GetEnumValues<MyEnum>()
?
Если возможно, я бы хотел найти решение, которое работает в Unity, но любое решение будет оценено в любом случае.
«большинству людей понадобится пара секунд, чтобы понять, что он делает», почему вы так говорите? Это совершенно понятно для меня. Я не пытаюсь быть дерзким; я хочу сказать, что среди разработчиков есть большой опыт. Вам не следует беспокоиться о том, что могут подумать другие разработчики, если вы пишете достаточно короткие инструкции. Это их обязанность понять это. Если вы действительно думаете, что это не ясно, вы всегда можете украсить его комментарием. –
Если вы переименуете 'Помощник' в' Enums' и 'GetEnumValues' в' For', он становится короче и самодокументируется: 'var firstEnum = Enums.For() .first(); –
Одиннадцать разных ответов в отмеченном дубликате, и большинство, если не все, по существу, для вызова 'GetValues ()', предполагает, что это так хорошо, как оно получается. Я бы использовал 'Cast()' вместо 'OfType ()' - первый больше похож на обычный литье, в то время как последнее больше похоже на использование оператора 'as', но не встроено варианты лучше этого. Однако см. Http://stackoverflow.com/a/2632759 для решения, которое фактически _does_ ограничивает вызов метода для типов перечисления. –