【问题标题】:Possible to use extensions methods on a generic Enum Type? (not enum value)可以在通用枚举类型上使用扩展方法吗? (不是枚举值)
【发布时间】:2018-08-28 21:34:27
【问题描述】:

最近对 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 }

我正在寻找一些简单的工作代码,这些代码使用起来非常简单,给人一种“流畅”的感觉,我的意思是它“读起来很好”。

【问题讨论】:

标签: c# enums extension-methods c#-7.3


【解决方案1】:

不,你不能这样做,只要TestEnum 是一个枚举类型,因为你不能用成员扩展它们。

由于TestEnum不是实例,你只能为实例创建扩展方法,不能为类型创建扩展方法,你不能让TestEnum.ToSequence()编译。

所以最好的办法是手动调用该方法,而不是作为扩展方法。

现在,正如@Bagdan Gilevich 在他的评论中提到的那样,这应该可以编译:

TestEnum.SomeEnumItem.ToSequence()

我将把意见放在一边,如果这是可以接受的,你必须自己做决定。

还有一个针对 C# 8(或更高版本)的语言功能建议,称为 Extension Everything。这可能给你你想要的,但我们必须看看它会发生什么。

【讨论】:

  • 小心指出什么有问题吗?请注意,问题不是你是否可以使用枚举作为约束,问题是你是否可以做EnumType.ToSequence(),答案仍然是否定的。
  • 看起来静态扩展方法是“扩展一切”功能中最简单的部分之一;是否有一些你不确定的原因?
  • 只是他们总是说他们保留推迟发布或更改发布的权利。
【解决方案2】:

Lasse Vågsæther Karlsen's answer 是正确的。另一种选择是简单地使用带有静态方法的静态类并传递泛型参数。 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>();

【讨论】:

  • 但是你说他的答案是错误的,现在你说他的答案是正确的。大声笑,并发布他建议作为答案的相同内容没有任何帮助。
  • 您的问题令人困惑。标题与实际问题不符。标题的答案是“是的,你可以做到”。包含问题的答案是“不,你不能那样做”。所以从技术上讲它是模棱两可的,但是当我错了我错了。即使我已经买了土地,我也不会在沙地上建房子。
  • 这是一个我已经尝试过的选项,我认为这可能是我们目前最好的选择。就我个人而言,我认为比在代码中包含第一个元素以访问扩展方法更漂亮。感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 2014-10-02
  • 1970-01-01
  • 2010-09-21
  • 2012-02-09
  • 2013-08-11
  • 1970-01-01
  • 2015-10-19
相关资源
最近更新 更多