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

发布于 2024-11-03 17:53:36 字数 266 浏览 0 评论 0原文

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

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

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

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

可能吗? 你如何做到这一点?

Instead of doing this to add a value to flags enum variable:

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

I'd like to create an extension method to make this possible:

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

Possible? How do you do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

伏妖词 2024-11-10 17:53:36

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

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

Not in any useful way. Enums are value types, so when making an extension method a copy of the enum will get passed in. This means you need to return it in order to make use of it

    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

And the other problem is you can't make this generic in any meaningful way. You'd have to create one extension method per enum type.

EDIT:

You can pull off a decent approximation by reversing the roles of the enums:

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


MyFlags.Coke.AddTo(ref flags);
从﹋此江山别 2024-11-10 17:53:36

我还在研究 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!!!

希望有帮助。您可以在以下位置查看更多扩展方法: 我的博客

I'm also working on Enum extension methods.

I tried to create add / remove generic methods for Enums, but I found it redundant.

To add you can just do:

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

To remove you can do:

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

Do not use XOR (^), it adds the flag if it does not exist.

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

Hope it helped. You can see more extension methods on: My blog

夜还是长夜 2024-11-10 17:53:36

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

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

Not a solution, but if your aim is to reduce verbosity and increase readability, a fluent interface with extension methods could help at least partially:

[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();
鹿! 2024-11-10 17:53:36

这对我来说很好用

public static void AddFlag(this ref EnumType current, EnumType toAdd)
{
     current |= toAdd;
}

This works fine for me

public static void AddFlag(this ref EnumType current, EnumType toAdd)
{
     current |= toAdd;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文