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

问题描述 投票:2回答:2

最近有一些对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# enums extension-methods c#-7.3
2个回答
5
投票

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

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

因此,您可以获得的最佳方法是手动调用该方法,而不是作为扩展方法。

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

TestEnum.SomeEnumItem.ToSequence()

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

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


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>();
© www.soinside.com 2019 - 2024. All rights reserved.