gpt4 book ai didi

c# - 枚举扩展方法清除就地

转载 作者:行者123 更新时间:2023-11-30 21:09:43 30 4
gpt4 key购买 nike

我有一个枚举,假设它叫做运动:

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

最佳答案

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

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;

由于(未)装箱,您的扩展方法效率非常低。

关于c# - 枚举扩展方法清除就地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8889930/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com