我想做的是这样的:我有带有组合标记值的枚举。
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#不会将枚举视为结构(即使它们是值类型),因此我无法添加这样的扩展类型。
有谁知道解决方法?
编辑:这现在存在于UnconstrainedMelody的0.0.0.2版本中。
(按照我的博客文章中有关枚举约束的要求。为了提供独立答案,我在下面列出了基本事实。)
最好的解决方案是等待我将其包含在UnconstrainedMelody 1中。这是一个使用带有“假”约束的C#代码的库,例如
where T : struct, IEnumConstraint
并变成
where T : struct, System.Enum
通过后期构建步骤。
编写它应该不会太难IsSet…尽管同时满足Int64基于-和UInt64基于- 的标志可能是棘手的部分。(我闻到了一些辅助方法的出现,基本上使我可以将任何标志枚举都视为具有基本类型UInt64。)
IsSet
Int64
UInt64
如果您致电,您希望该行为如何?
tester.IsSet(MyFlags.A | MyFlags.C)
?是否应该检查 所有 指定标志都已设置?那是我的期望。
我将在今晚回家的路上尝试这样做。我希望对有用的枚举方法进行快速的探讨,以使库快速达到可用的标准,然后再放松一下。
编辑:IsSet顺便说一下,我不确定名字。选项:
欢迎思想。我敢肯定,要把所有东西都固定下来还需要一段时间…
1或作为补丁提交,当然…