可以在通用枚举类型上使用扩展方法吗? (不是枚举值)

时间:2018-08-28 21:34:27

标签: c# enums extension-methods c#-7.3

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 :(得分:5)

不,只要TestEnum是枚举类型,就不能这样做,因为不能用成员扩展它们。

由于TestEnum不是实例,并且只能为实例创建扩展方法,而不能为类型创建扩展方法,因此无法编译TestEnum.ToSequence()

因此,最好的方法是手动调用该方法,而不是将其作为扩展方法。

现在,正如@Bagdan Gilevich在他的评论中提到的那样,应编译为:

TestEnum.SomeEnumItem.ToSequence()

我将意见抛在一边,如果可以接受,您必须下定决心。

还有C#8(或更高版本)的语言功能建议,称为Extension Everything。这个可能为您提供您想要的东西,但是我们必须看看它会发生什么。

答案 1 :(得分:3)

Lasse Vågsæther Karlsen's answer是正确的。另一种选择是简单地使用带有静态方法的静态类并传递通用参数。 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>();