C# 增强C枚举以使用按位操作?

C# 增强C枚举以使用按位操作?,c#,.net,.net-4.0,enums,C#,.net,.net 4.0,Enums,二进制操作非常有用。通过这种方式,我可以执行| ^&以生成一个新序列 但是,有时有些枚举没有附加基2值 或者根本没有价值 即: 如果可能的话,我想增强| |派生| |将值附加到枚举中 因此,我将能够做到: if (MyListItemType== Header |Footer ) ... 可能吗?或者有什么棘手的解决办法吗?您想使用枚举: 您要使用枚举: 您正在查找标志枚举: 您正在查找标志枚举: 然后可以对它们使用位运算符 然后可以对它们使用位运算符 如果可能的话,我想增强| |派生| |

二进制操作非常有用。通过这种方式,我可以执行| ^&以生成一个新序列

但是,有时有些枚举没有附加基2值 或者根本没有价值

即:

如果可能的话,我想增强| |派生| |将值附加到枚举中

因此,我将能够做到:

if (MyListItemType== Header |Footer ) ...
可能吗?或者有什么棘手的解决办法吗?

您想使用枚举:

您要使用枚举:


您正在查找标志枚举:

您正在查找标志枚举:

然后可以对它们使用位运算符

然后可以对它们使用位运算符

如果可能的话,我想增强| |派生| |将值附加到枚举中

除非重新定义枚举,否则无法实现这一点。但当它在你不拥有的代码中时,它就结束了。可能已经存在依赖于编号的代码,更改int值将破坏该代码

但这通常意味着枚举不是一个位集,因此尝试将其作为一个位集使用可能不是一个好主意

这是代码创建者的设计决策

请看您的示例列表:

var item = ListItemType.Header | ListItemType.Footer | ListItemType.SelectedItem;
项目真的可以同时是页眉、页脚和选定项目吗?这是一个相互排斥的选项列表

如果可能的话,我想增强| |派生| |将值附加到枚举中

除非重新定义枚举,否则无法实现这一点。但当它在你不拥有的代码中时,它就结束了。可能已经存在依赖于编号的代码,更改int值将破坏该代码

但这通常意味着枚举不是一个位集,因此尝试将其作为一个位集使用可能不是一个好主意

这是代码创建者的设计决策

请看您的示例列表:

var item = ListItemType.Header | ListItemType.Footer | ListItemType.SelectedItem;
项目真的可以同时是页眉、页脚和选定项目吗?这是一个相互排斥的选项列表

不,你不能

如果枚举没有标记为FlagsEnumeration和/或具有正确的位掩码值,则没有base2,则不能对其使用逐位运算来获得有意义的结果。

不,不能


如果枚举没有标记为FlagsEnumeration和/或具有正确的位掩码值,则没有base2,您不能对其使用按位操作来获得有意义的结果。

正如其他人所说,这是无法做到的,但我将使用使用扩展方法的快捷方式:

public enum MyEnum
    {
        This,
        That,
        TheOther
    }

    public static class MyEnumeExtensions
    {
        public static bool IsAny(this MyEnum enumValue, params MyEnum[] values)
        {
            return values.Any((e) => e == enumValue);
        }
    }
因此,我可以使用:

myEnum.IsAny(This, That);

这几乎就是您想要实现的目标。

正如其他人所说,这是无法实现的,但我将使用一种使用扩展方法的快捷方式:

public enum MyEnum
    {
        This,
        That,
        TheOther
    }

    public static class MyEnumeExtensions
    {
        public static bool IsAny(this MyEnum enumValue, params MyEnum[] values)
        {
            return values.Any((e) => e == enumValue);
        }
    }
因此,我可以使用:

myEnum.IsAny(This, That);

这几乎就是您想要实现的。

我无法控制枚举!它在一个dllI中,无法控制枚举!它在一个dllDo内,你是说在一个不是标志枚举的现有枚举上?@oded是的。有时有些枚举没有基数2。。。我看不出flags在这方面有什么帮助。这听起来可能很奇怪,但也许你可以组成一个像001010这样的位串,然后查找枚举并获取你的值。我提出了一个使用扩展方法的解决方案。你的意思是在现有的枚举上不是flags枚举吗?@oded yeah。有时有些枚举没有基数2。。。我看不出flags在这方面有什么帮助。这听起来可能很奇怪,但也许你可以组成一个像001010这样的位串,然后查找枚举并得到你的值。我提供了一个使用扩展方法的解决方案。@RoyiNamir anytime mate。“我在过去的项目中也做过类似的事情。”RoyiNamir anytime mate。我在过去的项目中也做过类似的事情。Flags属性只影响ToString和序列化。启用位操作是不必要的,而且肯定是不够的。Flags属性只影响ToString和序列化。启用位操作是不必要的,而且肯定是不够的。。。项目真的可以同时是页眉、页脚和选定项目吗?这是一个互斥选项列表。+1表示。。。项目真的可以同时是页眉、页脚和选定项目吗?这是一个相互排斥的选项列表。