использование расширения для перечисления более простым способом

#c#

#c#

Вопрос:

Я пытаюсь создать расширение для перечислений.

 public enum Cars {
   Chevrolet,
   Corvette,
   Lambo
}

public static T[] ToEnumArray<T>(this T type)
{
    return (T[])Enum.GetValues(type.GetType());
}

===============================
   this part will not work
===============================

var data = Cars.ToEnumArray();

===============================

foreach(var _result in data) {
   Console.WriteLine(_result);
}

 

ну, я знаю, что я мог бы использовать ToEnumArray<Cars>()
, но разве это невозможно? просто выполнив Cars.ToEnumArray()

как это будет работать, но без расширения

 public static T[] ToEnumArray<T>()
{
   return (T[])Enum.GetValues(typeof(T));
}

Cars[] cars = ToEnumArray<Cars>();
 

Комментарии:

1. Статических методов расширения не существует.

2. Расширения @Sweeper должны быть статичными 🙂

3. Как насчет «методы расширения должны вызываться как методы экземпляра или как статический метод для заключающего типа»? Вы не можете «расширить» тип.

4. Я не вижу смысла использовать методы расширения для этого случая.

5. Enum.GetValues<SomeType>() он уже создан для вас, однако не в той семантике, которую вы хотели бы

Ответ №1:

Есть только два способа вызвать метод расширения. Вы либо вызываете его как обычный статический метод, объявленный в статическом классе, либо вызываете его как метод экземпляра (вызов метода расширения).

Спецификация языка гласит:

Метод расширения — это обычный статический метод. Кроме того, там, где его охватывающий статический класс находится в области видимости, метод расширения может быть вызван с использованием синтаксиса вызова метода экземпляра, используя выражение получателя в качестве первого аргумента.

Вы не можете вызвать его для типа, в котором он не объявлен, например Cars .

Я предлагаю вам объявить обычный статический метод:

 static class UtilityClass {
    public static T[] ToEnumArray<T>() where T: Enum
    {
       return (T[])Enum.GetValues(typeof(T));
    }
}
 

И если вам не нравится UtilityClass. постоянно писать префикс, используйте using static директиву:

 using static SomeNamespace.UtilityClass;

...

Cars[] cars = ToEnumArray<Cars>();
 

Комментарии:

1. И если вам вообще не нравится печатать, вы можете добавить ко всем своим методам символ подчеркивания и цифру public static T[] _1<T>() FTW 🙂 о, и 1 за хороший пост

2. Я предлагаю добавить where T : Enum ограничение для ToEnumArray<T> метода