Можно ли использовать методы расширений для универсального типа Enum? (не перечисляемое значение) - PullRequest
0 голосов
/ 29 августа 2018

В последнее время появилось несколько обновлений C #, которые означают, что вы можете использовать Enum в качестве ограничения общего типа, и я пытаюсь использовать эту новую функцию для создания некоторых методов расширения, которые будут работать со всеми перечислениями.

Примерно так:

public static class EnumToSequenceExtension
{
    public static IEnumerable<T> ToSequence<T>(this T e)
        where T : Enum
    {
        foreach (T value in Enum.GetValues(e.GetType()))
        {
            yield return value;
        }
    }
}

Далее следует, как я хотел бы использовать этот метод, который не компилируется в том виде, в котором он сейчас находится, это попытка описать в псевдокоде, чего я пытаюсь достичь;

IEnumerable<TestEnum> sequence = TestEnum.ToSequence();

Где TestEnum - это мой тип перечисления, например

public enum TestEnum { Hello, World }

Я ищу какой-то простой рабочий код, который можно очень просто использовать с «плавным» ощущением, под которым я подразумеваю, что он «хорошо читает».

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Lasse Vågsæther Ответ Карлсена правильный. Другой альтернативой является просто использование статического класса со статическим методом и передача универсального параметра. C # 7.3 +

public static class EnumHelpers
{
    public static IEnumerable<TEnum> Sequence<TEnum>() where TEnum: struct, Enum
    {
        return Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
    }
}

использование:

EnumHelpers.Sequence<SomeEnum>();
0 голосов
/ 29 августа 2018

Нет, вы не можете этого делать, если только TestEnum является типом перечисления, поскольку вы не можете расширять их с помощью членов.

Поскольку TestEnum не является экземпляром, и вы можете создавать методы расширения только для экземпляров, а не для типов, вы не можете получить TestEnum.ToSequence() для компиляции.

Поэтому лучшее, что вы можете получить, это вызвать метод вручную, а не как метод расширения.

Теперь, как @ Багдан Гилевич упоминает в своем комментарии, это должно скомпилировать:

TestEnum.SomeEnumItem.ToSequence()

Я оставлю мнения в стороне, вам придется принять собственное решение, если это приемлемо.

Существует также предложение по языковой функции для C # 8 (или более поздней версии), которое называется Extension Everything . Это может дать вам то, что вы хотите, но мы должны посмотреть, что с ним будет.

...