我知道我可以成倍增长但是我不喜欢懒惰的编程.
有没有人设计过一些巫术来自动将枚举作为两个权力?
以下是我要使其具体化的例子:
[Flags]
private enum Targets : uint
{
None = 0,
Campaigns = 1,
CampaignGroups = 2,
Advertisers = 4,
AdvertiserGroups = 8,
AffiliateGroups = 16,
Affiliates = 32,
Creatives = 64,
DetailedLeads = 128,
DetailedSales = 256,
ProgramLeads = 512,
CreativeDeployments = 1024,
CampaignCategories = 2048,
Payouts = 4096,
All = uint.MaxValue
}
Run Code Online (Sandbox Code Playgroud)
Cod*_*ray 107
将值写为移位位,让编译器进行数学运算:
[Flags]
private enum Targets : uint
{
None = 0,
Campaigns = 1,
CampaignGroups = 2 << 0,
Advertisers = 2 << 1,
AdvertiserGroups = 2 << 2,
AffiliateGroups = 2 << 3,
Affiliates = 2 << 4,
Creatives = 2 << 5,
DetailedLeads = 2 << 6,
DetailedSales = 2 << 7,
ProgramLeads = 2 << 8,
CreativeDeployments = 2 << 9,
CampaignCategories = 2 << 10,
Payouts = 2 << 11,
// etc.
}
Run Code Online (Sandbox Code Playgroud)
詹姆斯的建议也很好.事实上,我更喜欢这种方式.你也可以这样写:
[Flags]
private enum Targets : uint
{
None = 0,
Campaigns = 1 << 0,
CampaignGroups = 1 << 1,
Advertisers = 1 << 2,
AdvertiserGroups = 1 << 3,
AffiliateGroups = 1 << 4,
// etc.
}
Run Code Online (Sandbox Code Playgroud)
dre*_*010 39
使用十六进制表示法比十进制表示法更简单(不需要计算器):
[Flags]
private enum Targets : uint
{
None = 0,
Campaigns = 0x01,
CampaignGroups = 0x02,
Advertisers = 0x04,
AdvertiserGroups = 0x08,
AffiliateGroups = 0x10,
Affiliates = 0x20,
Creatives = 0x40,
DetailedLeads = 0x80,
DetailedSales = 0x100,
ProgramLeads = 0x200,
CreativeDeployments = 0x400,
CampaignCategories = 0x800,
Payouts = 0x1000,
// and the pattern of doubling continues
// 0x2000
// 0x4000
// 0x8000
// 0x10000
}
Run Code Online (Sandbox Code Playgroud)
不像Cody和James的解决方案那么优雅,但不需要计算器.
快进五年,从 C# 7.0 开始,您可以使用新的数字二进制文字来简化枚举标志声明。
[Flags]
private enum Targets : uint
{
None = 0,
Campaigns = 0b0000_0000_0000_0001,
CampaignGroups = 0b0000_0000_0000_0010,
Advertisers = 0b0000_0000_0000_0100,
AdvertiserGroups = 0b0000_0000_0000_1000,
AffiliateGroups = 0b0000_0000_0001_0000,
Affiliates = 0b0000_0000_0010_0000,
Creatives = 0b0000_0000_0100_0000,
DetailedLeads = 0b0000_0000_1000_0000,
DetailedSales = 0b0000_0001_0000_0000,
ProgramLeads = 0b0000_0010_0000_0000,
CreativeDeployments = 0b0000_0100_0000_0000,
CampaignCategories = 0b0000_1000_0000_0000,
Payouts = 0b0001_0000_0000_0000,
All = uint.MaxValue
}
Run Code Online (Sandbox Code Playgroud)