c# - 可以在通用枚举类型上使用扩展方法吗?(不是枚举值)
问题描述
最近对 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(或更高版本)的语言功能建议,称为Extension Everything。这可能会给你你想要的,但我们必须看看它会发生什么。
推荐阅读
- javascript - 如何通过 Javascript 中的 URL 传递多个变量
- javascript - 节点强大的单选按钮
- html - 浮动的任何替代品:左?
- python - SyntaxError:只能使用星号表达式作为赋值目标
- c# - C# 中的 Microsoft Graph 搜索筛选字符串
- linux - Tomoyo 个人资料不存在
- c# - 如何找到与 Linq 组相同的连续值项目
- java - 为什么我的“Set-Cookie”响应标头没有被翻译成实际的 cookie?
- javascript - 使用原生 JavaScript 操作 CSS 类
- php - Mysql 使用 MATCH() AGAINST() 搜索字符串和数字不起作用