C# 对属性使用|运算符
这是我的设置:C# 对属性使用|运算符,c#,asp.net-core,.net-core,attributes,C#,Asp.net Core,.net Core,Attributes,这是我的设置: public class MyEnums { [Flags] public enum MyGroups { None = 0, Test1 = 1, Test2 = 2 } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] publ
public class MyEnums
{
[Flags]
public enum MyGroups
{
None = 0,
Test1 = 1,
Test2 = 2
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public sealed class MyAttribute : AuthorizeAttribute
{
private readonly MyGroups _allowedGroups;
public MyAttribute(MyGroups allowedGroups)
{
_allowedGroups = allowedGroups;
}
...
}
[MyAttribute(MyGroups.Test1 | MyGroups.Test2)]
public class MyController : Controller
{
...
}
我特别不理解控制器端的[MyAttribute(MyGroups.Test1 | MyGroups.Test2)]部分发生了什么。
我正在实例化多个属性(?)
提前感谢!|
是接线员
您没有定义2个属性,而是定义1,并传递一个值为Test1
或Test2
的枚举
如果使用二进制文字定义枚举,可能会更清楚:
[Flags]
public enum MyGroups
{
None = 0b0000, // 0000
Test1 = 0b0001, // 0001
Test2 = 0b0010 // 0010
}
[Flags]
public enum MyGroups
{
None = 0,
Test1 = 1,
Test2 = 2,
Test3 = 4,
Test4 = 8
}
当执行按位OR时,检查每个二进制数字,结果是任一值中都有1(与按位and相反,按位and要求两个数字都是1)
因此MyGroups.Test1 | MyGroups.Test2
相当于:
0001
| 0010
= 0011
使用此技术时,必须对枚举值使用平方数,以确保按位操作不会导致值与单个枚举值冲突。因此,如果要扩展枚举,应执行以下操作:
[Flags]
public enum MyGroups
{
None = 0b0000, // 0000
Test1 = 0b0001, // 0001
Test2 = 0b0010, // 0010
Test3 = 0b0100, // 0100
Test4 = 0b1000 // 1000
}
或使用整型文字:
[Flags]
public enum MyGroups
{
None = 0b0000, // 0000
Test1 = 0b0001, // 0001
Test2 = 0b0010 // 0010
}
[Flags]
public enum MyGroups
{
None = 0,
Test1 = 1,
Test2 = 2,
Test3 = 4,
Test4 = 8
}
这就是所谓的标志枚举,它“在枚举表示可能值的集合而不是单个值时使用”“来自优秀问答。它基本上允许您向用户发出信号,表示枚举中的值可以出现在任何分组中。
AttributeUsage
就是一个很好的例子。在您的代码中,它指定MyAttribute
对类和方法有效。因为只有一个属性,所以没有实例化多个属性。正如MindSwipe所提到的,您只有一个属性,但其值可以是MyGroups
enum的混合。在您的[MyAttribute(MyGroups.Test1 | MyGroups.Test2)]
中,alloweGroups
的值将是3(都是MyGroups.Test1
和MyGroups.Test2
),非常清楚,谢谢大家!我认为它与控制器本身的属性有关,而与[Flag]属性有关。再次感谢!:)