我想要做的事情是这样的:我拥有具有组合标志值的枚举.

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#的通用WHERE约束没有枚举限制,只有class和struct.C#没有将枚举视为 struct (即使它们是值类型),所以我不能添加这样的扩展类型.

有人知道解决方法吗?

推荐答案

EDIT: This is now live in version 0.0.0.2 of UnconstrainedMelody.

(按照我的blog post about enum constraints号信箱上的要求.为了一个独立的答案,我在下面包含了基本事实.)

最好的解决办法是等我把它包含在UnconstrainedMelody1中.这是一个库,它接受带有"假"约束的C#代码,例如

where T : struct, IEnumConstraint

把它变成

where T : struct, System.Enum

通过构建后步骤.

IsSet应该不会太难...尽管同时满足Int64UInt64国旗的需求可能是一个棘手的部分.(我闻到一些助手方法即将出现,基本上允许我将任何标志enum当作基类型UInt64来处理.)

如果你打电话来,你希望自己的行为是什么

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

? 是否应判断是否设置了all个指定标志?这就是我的期望.

今晚回家的路上我会试着这么做的.我希望对有用的枚举方法进行快速闪电战,使库快速达到可用的标准,然后放松一点.

编辑:顺便说一句,我不确定IsSet个名字.选项:

  • 包括
  • 包含
  • HasFlag(或HasFlags)
  • IsSet(这当然是一个选项)

欢迎大家多提意见.我相信任何事情都需要一段时间才能确定下来.


1或者作为补丁提交,当然...

.net相关问答推荐

Docker失败文件找不到

尽管有`disable`注释,但未 suppress Pylint语法错误

如何使用.NET8MapIdentityApi设置OpenApi操作ID

是否存在指定的(子)索引分隔符?

Gacutil.exe 成功添加程序集,但在资源管理器中无法查看程序集.为什么?

将 int 转换为 .NET 中的位数组

发布版本中的 Debug.WriteLine

为什么循环引用被认为是有害的?

通用枚举到int的C#非装箱转换?

如何在 WPF 应用程序中使用 App.config 文件?

在 C# 中与块等效?

VB.NET 与 C# 整数除法

ReaderWriterLockSlim 什么时候比简单的锁更好?

在 C# 中,为什么不能将 List 对象存储在 List 变量中

无法加载文件或程序集Antlr3.Runtime (1)或其依赖项之一

合并两个(或更多)PDF

如果锁定的对象内部发生异常,它会保持锁定状态吗?

WPF中的依赖属性和附加属性有什么区别?

从不同程序集中的类名中解析类型

为什么 IList 不支持 AddRange