AttributeUsage的AttributeTargets

在学习特性的AttributeUsage时,自己写代码,写着写着变成

[AttributeUsage(AttributeTargets.Class || AttributeTargets.Property || AttributeTargets.Method)]

然后发现编译出错了。仔细一看操作符出错了。||是逻辑操作符,虽然这里也有逻辑的意义,但是AttributeTargets.Class和Property并非是布尔型,而是枚举型。所以代码应该是:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method)]

然后就想,枚举型的默认值是1,然后每个加1。

其实不然,枚举型可是是short,int,byte,long型的整数。只是在未赋值的时候,默认值为上一个枚举值+1;

所以我查看了一下源代码

    public enum AttributeTargets
    {
        Assembly = 0x0001,          // 00000001
        Module = 0x0002,            // 00000010
        Class = 0x0004,             // 00000100
        Struct = 0x0008,            // 00001000
        Enum = 0x0010,              // 00010000
        Constructor = 0x0020,       // 00100000
        Method = 0x0040,            // 01000000
        Property = 0x0080,          // 10000000
        Field = 0x0100,             // 00000001 00000000
        Event = 0x0200,             // 00000010 00000000
        Interface = 0x0400,         // 00000100 00000000
        Parameter = 0x0800,         // 00001000 00000000
        Delegate = 0x1000,          // 00010000 00000000
        ReturnValue = 0x2000,       // 00100000 00000000
        //@todo GENERICS: document GenericParameter
        GenericParameter = 0x4000,  // 01000000 00000000


        All = Assembly | Module | Class | Struct | Enum | Constructor |
                        Method | Property | Field | Event | Interface | Parameter |
                        Delegate | ReturnValue | GenericParameter,  // 01111111 11111111
    }

并且打印出来:

        static void Main(string[] args)
        {
            Array values = Enum.GetValues(typeof(AttributeTargets));
            foreach (var value in values)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(value + ": ");
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("\t" + Convert.ToString((int)value, 2).PadLeft(16, '0'));
            }
            Console.Read();
        }

效果图:

 

posted @ 2015-04-24 13:15  江境纣州  阅读(348)  评论(0编辑  收藏  举报