首页 > 解决方案 > 可以在通用枚举类型上使用扩展方法吗?(不是枚举值)

问题描述

最近对 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 }

我正在寻找一些简单的工作代码,这些代码使用起来非常简单,具有“流利”的感觉,我的意思是它“读起来很好”。

标签: c#enumsextension-methodsc#-7.3

解决方案


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

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

所以你能得到的最好的方法是手动调用该方法,而不是作为扩展方法。

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

TestEnum.SomeEnumItem.ToSequence()

我将把意见放在一边,如果这是可以接受的,你将不得不自己决定。

还有一个针对 C# 8(或更高版本)的语言功能建议,称为Extension Everything。这可能会给你你想要的,但我们必须看看它会发生什么。


推荐阅读