一尘不染

任何人都知道缺少枚举泛型约束的好解决方法吗?

c#

我想做的是这样的:我有带有组合标记值的枚举。

public static class EnumExtension
{
    public static bool IsSet<T>( this T input, T matchTo ) 
        where T:enum //the constraint I want that doesn't exist in C#3
    {    
        return (input & matchTo) != 0;
    }
}

因此,我可以这样做:

MyEnum tester = MyEnum.FlagA | MyEnum.FlagB

if( tester.IsSet( MyEnum.FlagA ) )
    //act on flag a

不幸的是,C#泛型的约束没有枚举约束,只有类和结构。C#不会将枚举视为结构(即使它们是值类型),因此我无法添加这样的扩展类型。

有谁知道解决方法?


阅读 247

收藏
2020-05-19

共1个答案

一尘不染

编辑:这现在存在于UnconstrainedMelody的0.0.0.2版本中。

(按照我的博客文章中有关枚举约束的要求。为了提供独立答案,我在下面列出了基本事实。)

最好的解决方案是等待我将其包含在UnconstrainedMelody
1中。这是一个使用带有“假”约束的C#代码的库,例如

where T : struct, IEnumConstraint

并变成

where T : struct, System.Enum

通过后期构建步骤。

编写它应该不会太难IsSet…尽管同时满足Int64基于-和UInt64基于-
的标志可能是棘手的部分。(我闻到了一些辅助方法的出现,基本上使我可以将任何标志枚举都视为具有基本类型UInt64。)

如果您致电,您希望该行为如何?

tester.IsSet(MyFlags.A | MyFlags.C)

?是否应该检查 所有 指定标志都已设置?那是我的期望。

我将在今晚回家的路上尝试这样做。我希望对有用的枚举方法进行快速的探讨,以使库快速达到可用的标准,然后再放松一下。

编辑:IsSet顺便说一下,我不确定名字。选项:

  • 包括
  • 包含
  • HasFlag(或HasFlags)
  • IsSet(肯定是一个选项)

欢迎思想。我敢肯定,要把所有东西都固定下来还需要一段时间…


1或作为补丁提交,当然…

2020-05-19