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

问题描述 投票:0回答:4

不要这样做来向 flags 枚举变量添加值:

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

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

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

可能吗?你是如何做到的?

c# .net enums flags bit-fields
4个回答
24
投票

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

    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

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

编辑:

您可以通过反转枚举的角色来获得不错的近似值:

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


MyFlags.Coke.AddTo(ref flags);

16
投票

我也在研究

Enum
扩展方法。

我尝试为

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

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

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

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

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

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

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

希望有帮助。您可以在:我的博客

查看更多扩展方法

2
投票

这不是一个解决方案,但如果您的目标是减少冗长并提高可读性,那么带有扩展方法的流畅界面至少可以部分提供帮助:

[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();

0
投票

这对我来说效果很好

public static void AddFlag(this ref EnumType current, EnumType toAdd)
{
     current |= toAdd;
}
© www.soinside.com 2019 - 2024. All rights reserved.