#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>
метода