向位字段添加值的扩展方法(标志枚举)

Ron*_*rby 7 .net c# enums flags bit-fields

而不是这样做为标志枚举变量添加一个值:

MyFlags flags = MyFlags.Pepsi;
flags = flags | MyFlags.Coke;
Run Code Online (Sandbox Code Playgroud)

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

MyFlags flags = MyFlags.Pepsi;
flags.Add(MyFlags.Coke);
Run Code Online (Sandbox Code Playgroud)

可能?你怎么做呢?

Mat*_*eer 17

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

    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
Run Code Online (Sandbox Code Playgroud)

另一个问题是你不能以任何有意义的方式使这个通用.您必须为每个枚举类型创建一个扩展方法.

编辑:

你可以通过颠倒枚举的角色来实现一个合适的近似:

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


MyFlags.Coke.AddTo(ref flags);
Run Code Online (Sandbox Code Playgroud)

  • *Necro'ing* 似乎可以通过执行 `addTo |= add` 来简化这个添加。 (2认同)

Ofi*_*fir 10

我也在研究Enum扩展方法。

我试图为Enums创建添加/删除通用方法,但我发现它是多余的。

要添加,您可以执行以下操作:

MyFlags flags = MyFlags.Pepsi;
flags |= MyFlags.Coke;
Run Code Online (Sandbox Code Playgroud)

要删除,您可以执行以下操作:

MyFlags flags = MyFlags.Pepsi | MyFlags.Coke;
flags &= ~MyFlags.Coke;
Run Code Online (Sandbox Code Playgroud)

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

flags ^= MyFlags.Coke; // Do not use!!!
Run Code Online (Sandbox Code Playgroud)

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

  • XOR 实际上会切换标志——所以就像你说的那样,如果它不存在,它就会添加它,但如果它确实存在,它也应该将其删除。[很好的参考](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators#Reverse_algorithm.3A_an_array_of_booleans_from_a_mask)(虽然指的是Javascript) (2认同)