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



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

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

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

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

因此,您能得到的最好的方法是手动调用该方法,而不是作为扩展方法。

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

TestEnum.SomeEnumItem.ToSequence()

我撇开意见不谈,如果这是可以接受的,你必须自己决定。

还有一个针对 C# 8(或更高版本(的语言功能建议,称为扩展所有内容。这可能会给你你想要的东西,但我们必须看看会发生什么。

Lasse Vågsæther Karlsen的回答是正确的。另一种选择是简单地将静态类与静态方法一起使用并传递泛型参数。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>();

最新更新