2016-11-02 3 views
2

Существует несколько ситуаций, когда я хочу иметь значения перечислимых значений 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, но любое решение будет оценено в любом случае.

+0

«большинству людей понадобится пара секунд, чтобы понять, что он делает», почему вы так говорите? Это совершенно понятно для меня. Я не пытаюсь быть дерзким; я хочу сказать, что среди разработчиков есть большой опыт. Вам не следует беспокоиться о том, что могут подумать другие разработчики, если вы пишете достаточно короткие инструкции. Это их обязанность понять это. Если вы действительно думаете, что это не ясно, вы всегда можете украсить его комментарием. –

+0

Если вы переименуете 'Помощник' в' Enums' и 'GetEnumValues' в' For', он становится короче и самодокументируется: 'var firstEnum = Enums.For () .first(); –

+0

Одиннадцать разных ответов в отмеченном дубликате, и большинство, если не все, по существу, для вызова 'GetValues ​​()', предполагает, что это так хорошо, как оно получается. Я бы использовал 'Cast ()' вместо 'OfType ()' - первый больше похож на обычный литье, в то время как последнее больше похоже на использование оператора 'as', но не встроено варианты лучше этого. Однако см. Http://stackoverflow.com/a/2632759 для решения, которое фактически _does_ ограничивает вызов метода для типов перечисления. –

ответ

3

Это идеальное решение. .Net не предлагает строго типизированных Enum.GetValues ​​в это время. Людям потребуется всего несколько секунд, чтобы понять, что это делает, потому что можно ожидать, что .NET предложит строго типизированное перечисление Enums одного типа прямо сейчас.

Вы правильно используете GetValues ​​как MSDN suggests.

Смежные вопросы