向位域(flags enum)添加值的扩展方法

本文关键字:扩展 方法 添加 位域 flags enum | 更新日期: 2023-09-27 17:52:56

为flags的枚举变量添加一个值:

MyFlags flags = MyFlags.Pepsi;
flags = flags | MyFlags.Coke;

我想创建一个扩展方法来实现这一点:

MyFlags flags = MyFlags.Pepsi;
flags.Add(MyFlags.Coke);
>

<罢工可能吗?>你是怎么做的?

向位域(flags enum)添加值的扩展方法

没有任何用处。枚举是值类型,因此在创建扩展方法时,将传入枚举的副本。这意味着您需要返回它才能使用它

    public static class FlagExtensions
    {
        public static MyFlags Add(this MyFlags me, MyFlags toAdd)
        {
             return me | toAdd;
        }
    }
    flags = flags.Add(MyFlags.Coke); // not gaining much here

另一个问题是你不能以任何有意义的方式使它泛型。您必须为每个enum类型创建一个扩展方法。

编辑:

您可以通过颠倒枚举的角色来获得一个不错的近似:

public static class FlagsExtensions
{
    public static void AddTo(this MyFlags add, ref MyFlags addTo)
    {
         addTo = addTo | add;
    }
}

MyFlags.Coke.AddTo(ref flags);

我也在研究Enum扩展方法。

我试图为Enum创建添加/删除泛型方法,但我发现它是多余的。

添加:

MyFlags flags = MyFlags.Pepsi;
flags |= MyFlags.Coke;

删除:

MyFlags flags = MyFlags.Pepsi | MyFlags.Coke;
flags &= ~MyFlags.Coke;

不要使用异或(^),如果它不存在,它会添加标志。

flags ^= MyFlags.Coke; // Do not use!!!

希望有帮助。你可以看到更多的扩展方法:我的博客

不是一个解决方案,但是如果您的目标是减少冗长和增加可读性,那么带有扩展方法的流畅接口至少可以部分地帮助您:

[Flags]
public enum MyFlags
{
    None = 0,
    A    = 0x1,
    B    = 0x2,
}
public static class MyFlagsExt
{
    public static MyFlags A(this MyFlags myFlags)
    {
        return myFlags | MyFlags.A;
    }
    public static MyFlags B(this MyFlags myFlags)
    {
        return myFlags | MyFlags.B;
    }
}
...
var flags = MyFlags.A.B();