如何在枚举实例扩展方法中调用泛型Enum<TEnum>类的静态成员?
解决枚举泛型扩展与基类调用的兼容问题
问题根源
当你通过Enum?类型的变量调用EnumCount扩展方法时,泛型参数TEnum会被推断为System.Enum(所有枚举的基类),而非实际的具体枚举类型,这不符合Enum<TEnum>的泛型约束条件,导致无法直接访问Enum<TEnum>.Length静态成员。
方案一:抽离核心逻辑到辅助类(推荐)
将枚举相关的核心逻辑封装到非泛型辅助类中,让泛型类和扩展方法统一调用该类的方法,彻底避免重复代码:
- 创建辅助类封装核心逻辑
internal static class EnumHelper { public static int GetEnumLength(Type enumType) { if (!enumType.IsEnum) throw new ArgumentException("传入类型必须是枚举类型", nameof(enumType)); return Enum.GetNames(enumType).Length; } }
- 修改泛型
Enum<TEnum>类
public class Enum<TEnum> where TEnum : notnull, Enum, IConvertible { public static int Length => EnumHelper.GetEnumLength(typeof(TEnum)); }
- 修改扩展方法
EnumCount
public static class EnumExt { public static int EnumCount<TEnum>(this TEnum val) where TEnum : notnull, Enum { return EnumHelper.GetEnumLength(val.GetType()); } }
方案二:通过反射调用泛型类静态成员
如果需要直接复用Enum<TEnum>类中的静态成员(比如后续有更多复杂逻辑在泛型类中),可以通过反射动态构造泛型类型并调用其静态属性:
public static class EnumExt { public static int EnumCount<TEnum>(this TEnum val) where TEnum : notnull, Enum { Type actualEnumType = val.GetType(); // 构造泛型Enum<T>类型 Type genericEnumType = typeof(Enum<>).MakeGenericType(actualEnumType); // 获取Length静态属性 var lengthProperty = genericEnumType.GetProperty(nameof(Enum<int>.Length), BindingFlags.Public | BindingFlags.Static); if (lengthProperty == null) throw new InvalidOperationException("无法获取枚举长度属性"); return (int)lengthProperty.GetValue(null); } }
两种方案都能满足你的需求:无需重复编写逻辑,也不用在PerformTest中添加大量分支,同时支持Enum?类型的参数调用。
内容的提问来源于stack exchange,提问作者krowe
相关产品推荐
相关产品推荐

