而不是这样做,以便为flags枚举变量添加一个值:
MyFlags flags = MyFlags.Pepsi;
flags = flags | MyFlags.Coke;
我想创建一个扩展方法来实现这一目标:
MyFlags flags = MyFlags.Pepsi;
flags.Add(MyFlags.Coke);
可能?你是怎么做到的?
答案 0 :(得分:15)
没有任何有用的方式。枚举是值类型,因此在创建扩展方法时,将传入枚举的副本。这意味着您需要返回它才能使用它
public static class FlagExtensions
{
public static MyFlags Add(this MyFlags me, MyFlags toAdd)
{
return me | toAdd;
}
}
flags = flags.Add(MyFlags.Coke); // not gaining much here
另一个问题是你不能以任何有意义的方式使这个通用。您必须为每个枚举类型创建一个扩展方法。
编辑:
你可以通过颠倒枚举的角色来实现合适的近似:
public static class FlagsExtensions
{
public static void AddTo(this MyFlags add, ref MyFlags addTo)
{
addTo = addTo | add;
}
}
MyFlags.Coke.AddTo(ref flags);
答案 1 :(得分:3)
我也在研究Enum
扩展方法。
我尝试为Enum
创建添加/删除通用方法,但我发现它是多余的。
要添加,您可以这样做:
MyFlags flags = MyFlags.Pepsi;
flags |= MyFlags.Coke;
要删除,您可以执行以下操作:
MyFlags flags = MyFlags.Pepsi | MyFlags.Coke;
flags &= ~MyFlags.Coke;
不要使用XOR(^),如果它不存在,则会添加标记。
flags ^= MyFlags.Coke; // Do not use!!!
希望它有所帮助。您可以在My blog
上看到更多扩展方法答案 2 :(得分:0)
不是解决方案,但如果您的目标是减少冗长并提高可读性,那么使用扩展方法的流畅界面至少可以帮助您:
[Flags]
public enum MyFlags
{
None = 0,
A = 0x1,
B = 0x2,
}
public static class MyFlagsExt
{
public static MyFlags A(this MyFlags myFlags)
{
return myFlags | MyFlags.A;
}
public static MyFlags B(this MyFlags myFlags)
{
return myFlags | MyFlags.B;
}
}
...
var flags = MyFlags.A.B();