有没有更优雅的方式这样做?
[Flags]
public enum SomeFlaggedEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 4
}
private SomeFlaggedEnum _myFlags;
public bool EnabledValue1
{
set
{
if (value)
{
_myFlags |= SomeFlaggedEnum.Value1;
}
else
{
_myFlags &= ~SomeFlaggedEnum.Value1;
}
}
}
我知道可能有一个简单的答案,我只是在想它...
编辑:如其中一个答案所指出的,枚举是不正确的。这只是在这个例子中,而不是在实际的代码中。答案 0 :(得分:7)
我的意思是,你可以这样做:
_myFlags = value ? myFlags | SomeFlaggedEnum.Value1 : myFlags & ~SomeFlaggedEnum.Value1;
但我认为你的解决方案很好。
答案 1 :(得分:6)
好吧,你可以使用条件:
_myFlags = value ? _myFlags | SomeFlaggedEnum.Value1
: _myFlags & ~SomeFlaggedEnum.Value1;
答案 2 :(得分:2)
你的二传手很好。
问题是使用FlagsAttribute
不会使编译器选择有用的值来将枚举成员用作标志。 SomeFlaggedEnum.Value1
为零,因为它是枚举中第一个声明的值,因此它根本不代表一个标志。
尝试
[Flags]
public enum SomeFlaggedEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 4
}
答案 3 :(得分:2)
如果你有一个每个标志的属性来设置它,看起来它会变得非常难看,假设你有超过3个标志。如果你能说出要设置哪些标志的单一方法会不会更容易?
public void EnableFlag(SomeFlaggedEnum value, bool set) {
_myFlags = set ? value | _myFlags : ~value & _myFlags;
}
EnableFlag(SomeFlaggedEnum.Value1, true);
答案 4 :(得分:1)
为标志创建一个通用的setter(在Enum类中已经有一个通用的“HasFlag”,但像这样的扩展将补充它。
public static class EnumExtensions
{
public static T SetFlags<T>(this T value, T flags, bool on) where T : struct
{
long lValue = Convert.ToInt64(value);
long lFlag = Convert.ToInt64(flags);
if (on)
{
lValue |= lFlag;
}
else
{
lValue &= (~lFlag);
}
return (T)Enum.ToObject(typeof(T), lValue);
}
}
一旦你有了这个,就可以为每个标志创建属性(但很快就会变得混乱),或者只是将获取和设置标志委托给HasFlag / SetFlag