Метод расширения для добавления значения в битовое поле (перечисление флагов) - PullRequest
5 голосов
/ 26 апреля 2011

Вместо этого добавьте значение в переменную перечисления flags:

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

Я бы хотел создать метод расширения, чтобы сделать это возможным:

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

Возможно? Как ты это делаешь?

Ответы [ 3 ]

15 голосов
/ 26 апреля 2011

Не любым полезным способом. Перечисления являются типами значений, поэтому при создании метода расширения будет передана копия перечисления. Это означает, что вам нужно вернуть его, чтобы использовать его

    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

И другая проблема в том, что вы не можете сделать это универсальным способом. Вам нужно создать один метод расширения для каждого типа перечисления.

EDIT:

Вы можете получить приличное приближение, поменяв роли перечислений:

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


MyFlags.Coke.AddTo(ref flags);
3 голосов
/ 17 октября 2012

Я также работаю над Enum методами расширения.

Я пытался создать общие / добавленные методы для Enum s, но я нашел это излишним.

Чтобы добавить вы можете просто сделать:

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

Для удаления вы можете сделать:

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

Не используйте XOR (^) , он добавляет флаг, если он не существует.

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

Надеюсь, это помогло. Вы можете увидеть больше методов расширения: Мой блог

0 голосов
/ 18 мая 2014

Не решение, но если ваша цель состоит в том, чтобы уменьшить многословность и повысить удобочитаемость, свободный интерфейс с методами расширения может помочь хотя бы частично:

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