能否为类型参数编写扩展方法?枚举静态扩展实现咨询
枚举静态扩展方法的实现方案
需求背景
你现有一个获取枚举所有值的静态方法:
public static List<T> GetAllEnumValues<T>() where T : Enum { return Enum.GetValues(typeof(T)).Cast<T>().ToList(); }
希望将其改造为类似Countries.GetAllEnumValues();的调用形式,替代原有的GenericMethods.GetAllEnumValues<Countries>(),并且想知道能否在不传入枚举实例的情况下实现。你尝试的写法无法编译:
public static List<T> GetAllEnumValues<this T>() where T : Enum //无法编译 { return Enum.GetValues(typeof(T)).Cast<T>().ToList(); }
解答
C#目前(截至C# 12)不支持直接给静态类型(包括枚举类型本身)添加扩展方法,因此你设想的写法无法实现,但可以通过以下两种方案达到近似的调用体验:
方案一:基于枚举空实例的扩展方法
可以给枚举实例添加扩展方法,利用空实例触发调用,无需创建有效枚举实例:
public static List<T> GetAllEnumValues<T>(this T _) where T : Enum { return Enum.GetValues(typeof(T)).Cast<T>().ToList(); }
调用方式:
// 方式1:通过default获取空实例 default(Countries).GetAllEnumValues(); // 方式2:强制转换0得到空实例 ((Countries)0).GetAllEnumValues();
方案二:嵌套泛型类实现类级调用
通过嵌套泛型类的方式,实现接近枚举类型直接调用的体验:
public static class EnumTools { public static class For<T> where T : Enum { public static List<T> GetAllEnumValues() { return Enum.GetValues(typeof(T)).Cast<T>().ToList(); } } }
调用方式:
EnumTools.For<Countries>.GetAllEnumValues();
这种写法不需要依赖任何枚举实例,调用形式简洁直观。
额外说明
目前C#语法不支持静态扩展方法,因此无法完全实现Countries.GetAllEnumValues()这种直接调用枚举类型静态方法的形式。如果后续C#版本新增该特性,你的初始设想才有可能落地。
内容的提问来源于stack exchange,提问作者HWS-SLS
相关产品推荐
相关产品推荐

