我有一个枚举,假设它被称为运动:
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());
}
答案 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#