Метод расширения Enum для очистки на месте - PullRequest
2 голосов
/ 17 января 2012

У меня есть enum, предположим, что он называется sports:

enum Sports
{
  Baseball = 1,
  Basketball = 2,
  Football = 4,
  Hockey = 8,
  Soccer = 16,
  Tennis = 32,
  etc...
}

Я бы хотел добавить метод расширения, который очищает бит маски следующим образом:

Sports Mask = Sports.Baseball | Sports.Football | Sports.Tennis; //37
Mask.Clear(Sports.Baseball);
// Mask = Football | Tennis

Thisэто метод расширения, который я придумал, он не работает.Очистка не влияет на маску, значение остается 37. Я не уверен, что могу изменить эту часть из метода расширения.Есть ли другой способ сделать это?

public static void Clear<T>(this Enum value, T remove)
{
  Type type = value.GetType();
  object result;

  if (type.Equals(typeof(ulong)))
  {
    result = Convert.ToUInt64(value) & ~Convert.ToUInt64((object)remove);
  }
  else
  {
    result = Convert.ToInt64(value) & ~Convert.ToInt64((object)remove);
  }

  value = (Enum)Enum.Parse(type, result.ToString());
}

Ответы [ 3 ]

3 голосов
/ 17 января 2012

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

public static T Clear<T>(this Enum value, T remove) { ... }
mask = mask.Clear(Sports.Baseball);
//just like
//DateTime dt = DateTime.Now;
//dt = dt.AddHour(1);

И, кстати, я не думаю, что здесь стоит использовать метод расширения.Почему бы просто не использовать:

mask = mask & ~Sports.BaseBall;
mask = mask & ~anotherMask;

Ваш метод расширения очень неэффективен из-за (не) бокса.

1 голос
/ 17 января 2012

Кшиштоф Квалина из MSDN Blogs объясняет, как очистить значения Enum с использованием атрибута Flags в перечислениях в следующих двух ссылках:

http://blogs.msdn.com/b/kcwalina/archive/2006/08/29/clearingflagenum.aspx

http://weblogs.asp.net/bhouse/archive/2006/08/29/Clearing-Enum-Flags.aspx

Образец:

[Flags]
public enum Foos {
    A = 1,
    B = 2,
    C = 4,
    D = 8,
    AB = A | B,
    CD = C | D,
    All = AB | CD
}

static class Program {
    static void Main() {
        Foos value = Foos.AB;
        Console.WriteLine(ClearFlag(value,Foos.A);
    }
    public static Foos ClearFlag(Foos value, Foos flag) {
       return value & ~flag;
    }
}
0 голосов
/ 17 января 2012

Вы просите передать экземпляр в метод расширения по ссылке. Но вы не можете сделать это в C # .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...