枚举扩展方法清除就地

时间:2012-01-17 05:07:20

标签: c# c#-4.0 enums

我有一个枚举,假设它被称为运动:

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

这是我提出的扩展方法,它不起作用。 Clear不会影响Mask,值仍为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 个答案:

答案 0 :(得分:3)

因为枚举是值类型,所以您只修改了参数。您可以返回修改后的值并将其分配给原始变量。

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 :(得分:1)

MSDN博客中的Krzysztof Cwalina解释了如何使用以下2个链接上的枚举使用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;
    }
}

答案 2 :(得分:0)

您要求通过引用将实例传递给扩展方法。 But you can't do this in C#