可以在通用枚举类型上使用扩展方法吗? (不是枚举值)
Possible to use extensions methods on a generic Enum Type? (not enum value)
最近对 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 }
我正在寻找一些简单易用且具有 "fluent" 感觉的简单工作代码,我的意思是 "reads well".
不,你不能这样做,只要 TestEnum
是一个枚举类型,因为你不能用成员扩展它们。
由于 TestEnum
不是实例,您只能为实例创建扩展方法,不能为类型创建扩展方法,因此无法编译 TestEnum.ToSequence()
。
所以最好的办法是手动调用该方法,而不是作为扩展方法。
现在,正如 @Bagdan Gilevich 在他的评论中提到的,这应该编译:
TestEnum.SomeEnumItem.ToSequence()
我先不提意见,能不能接受你自己拿主意。
还有一个针对 C# 8(或更高版本)的语言功能建议,称为 Extension Everything。这个可能给你你想要的,但我们必须看看它会发生什么。
是正确的。另一种选择是简单地使用带有静态方法的静态 class 并传递通用参数。 C# 7.3+
public static class EnumHelpers
{
public static IEnumerable<TEnum> Sequence<TEnum>() where TEnum: struct, Enum
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
}
}
用法:
EnumHelpers.Sequence<SomeEnum>();
最近对 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 }
我正在寻找一些简单易用且具有 "fluent" 感觉的简单工作代码,我的意思是 "reads well".
不,你不能这样做,只要 TestEnum
是一个枚举类型,因为你不能用成员扩展它们。
由于 TestEnum
不是实例,您只能为实例创建扩展方法,不能为类型创建扩展方法,因此无法编译 TestEnum.ToSequence()
。
所以最好的办法是手动调用该方法,而不是作为扩展方法。
现在,正如 @Bagdan Gilevich 在他的评论中提到的,这应该编译:
TestEnum.SomeEnumItem.ToSequence()
我先不提意见,能不能接受你自己拿主意。
还有一个针对 C# 8(或更高版本)的语言功能建议,称为 Extension Everything。这个可能给你你想要的,但我们必须看看它会发生什么。
public static class EnumHelpers
{
public static IEnumerable<TEnum> Sequence<TEnum>() where TEnum: struct, Enum
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
}
}
用法:
EnumHelpers.Sequence<SomeEnum>();