如何为所有枚举类型创建一个静态扩展方法?

编程语言 2026-07-09

我在尝试创建一个静态扩展方法,它可以用于C#的任意枚举类型。我希望能够在任意一个枚举值上调用这个方法。

然而,由于扩展方法是为特定类型定义的,我不确定如何创建一个泛型扩展方法,适用于所有枚举类型。是否可以通过扩展块来实现?

现在我可以只为某个特定枚举定义方法:

extension(MyEnum)
{
     public static Direction Random => Enum.GetValues<MyEnum>().Choice();
}

但我想要像下面这样的:

extension<T>() where T : Enum
{
    public static T Random => Enum.GetValues<T>().Choice();
}

解决方案

你的语法和泛型约束都略有偏差:

  • 你仍然需要把要扩展的类型放在括号内,也就是 extension<T>(T)
  • 你还需要将 T 约束为不可为空的值类型(以便调用 Enum.GetValues<T>(),因此 where T : struct, Enum

这段代码可以编译(前提是存在一个合适的 Choice 方法):

public static class Extensions
{
    extension<T>(T) where T : struct, Enum
    {
        public static T Random => Enum.GetValues<T>().Choice();
    }
}

不过我建议把它做成方法,而不是属性。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章