我已经扩展了Enum类型,如下所示:

public class Enum<TEnum> where TEnum : notnull, Enum, IConvertible {
    public static int Length => Enum.GetNames(typeof(TEnum)).Length;
}

我还扩展了枚举,如下所示:

public static class EnumExt {
    public static int EnumCount<TEnum>(this TEnum val) where TEnum : notnull, Enum {
        // return Enum.GetNames(val.GetType()).Length;
        return Enum<TEnum>.Length;
    }
}

我的主窗口看起来像这样:

public partial class MainWindow : Window {
    private void PerformTest(Enum? ptr) {
        if(ptr is null) {
            Debug.WriteLine("Error: There is no value selected.");
        } else {
            Debug.WriteLine("Count: {0}", ptr.EnumCount());
        }
    }
}

我需要能够从EnumExt的方法访问类Enum&lt;TEnum&gt;中的静态方法.如果我取消对EnumExt中注释行的注释,它会工作得很好.问题是,这一行只代表许多方法中的许多行,我不想为两个类全部重写它们,也不想在PerformTest()中编写一个大的SELECT来涵盖每种可能的Enum类型.速度或内存其实不是什么大问题,但我需要在不知道预先使用的特定枚举的情况下工作(它们将在编译时知道,如果需要的话,可以使用IDK),这就是我使用Enum的原因?在PerformTest()中.我花了太长时间试图弄清楚这件事.请帮帮忙.

推荐答案

你也需要将PerformTest方法设置为泛型:

void PerformTest<TEnum>(TEnum? ptr) where TEnum : struct, Enum, IConvertible{
    if(ptr is null) {
        Debug.WriteLine("Error: There is no value selected.");
    } else {
        Debug.WriteLine("Count: {0}", ptr.Value.EnumCount());
    }
}

否则,传递给EnumExt.EnumCount<T>的泛型类型将被确定为System.Enum(泛型是编译时构造的,泛型参数是在编译期间确定的,或者使用反射到call generic type with "runtime" type).

附注:

  1. 我强烈建议在使用泛型枚举参数时添加struct约束(就像我在PerformTest上所做的那样).

  2. 从.NET 5开始,Enum.GetValuesa generic overload个,这应该比非泛型的性能更好.

  3. 无论哪种方式-切换到自动属性(否则每次都将调用Enum.GetNames(typeof(TEnum)).Length):

public class Enum<TEnum> where TEnum : notnull, Enum, IConvertible
{
    public static int Length { get; } = Enum.GetNames(typeof(TEnum)).Length;
}

Csharp相关问答推荐

==和Tuple对象的相等<>

在一个模拟上设置一个方法,该模拟具有一个参数,该参数是一个numc函数表达式

如何在没有额外副本的情况下将存储在IntPtr下的原始图像数据写入WinUI3中的Image控件?

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

try 在.Net核心身份注册页面中使用AJAX,但没有成功..NET Core 5.0 Razor页面应用程序

BlockingCollection T引发意外InvalidOperationException

未在数据流块之间传播完成

具有可空类型的C#NOTNULL约束具有意外行为

Regex字母数字校验

使用CollectionView时在.NET Maui中显示数据时出现问题

Azure Functions v4中的Serilog控制台主题

{ or ; expected error如何解决此问题

如何在C#中正确类型化带有泛型的嵌套类

工厂类是如何在.NET 8中注册的?

C#中使用ReadOnlySpan的泛型类型推理

如何在特定时间间隔运行多个后台任务?

SignalR跨域

SqlException:无法打开数据库.升级到Dotnet 8后-数据库兼容性版本-非EFCore兼容性级别

客户端/服务器RPC如何处理全局变量?

如何根据分割文本的块数来计算文本的大小?