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]属性有关。再次感谢!:)