C# Attribute

  Attribute 是C#非常重要的一块内容,需要研究一下。

 

Attribute  的简单使用:简而言之,就是可以自定义通用标志位,而不是在每个所需的类型中分别增加标志位。

    //class专用attribute
    [AttributeUsage(AttributeTargets.Class)]
    public class TestAttribute : Attribute
    {
        public bool ReadFlag { get; set; }

        public bool WriteFlag { get; set; }

        public TestAttribute(){ }

        public TestAttribute(bool readFlag, bool writeFlag)
        {
            this.ReadFlag = readFlag;
            this.WriteFlag = writeFlag;
        }
    }

    //property专用attribute
    [AttributeUsage(AttributeTargets.Property)]
    public class TestFieldAttribute : Attribute
    {
        public bool IsIgnore { get; set; }

        public TestFieldAttribute(){ }

        public TestFieldAttribute(bool isIgnore)
        {
            this.IsIgnore = isIgnore;
        }
    }

    //数字基类
    public abstract class TestDemoBase
    {
        public abstract int Num { get; set; }
    }

    //数字类一
    [Test(true, true)]  //使用时可以去掉"Attribute"后缀
    public class TestDemoA : TestDemoBase
    {
        [TestField(IsIgnore = false)]
        public override int Num { get; set; }
    }

    //数字类二
    [Test(true, false)]
    public class TestDemoB : TestDemoBase
    {
        [TestField(IsIgnore = true)]
        public override int Num { get; set; }
    }

    //针对数字基类的打印接口
    public static class Writer
    {
        public static void Output<T>(T writer) where T : TestDemoBase
        {
            var objectType = typeof(T);    //typeof参数为类型而不是对象
            var tagAttr = objectType.GetCustomAttribute(typeof(TestAttribute), false) as TestAttribute; //获取类的单个attribute
            if(tagAttr.WriteFlag == true)
            {
                Console.WriteLine("Output:" + writer.Num.ToString());   //write标志为true则可以打印            
            }
            else
            {
                var propertyInfo = objectType.GetProperty("Num");
                foreach (var attribute in propertyInfo.GetCustomAttributes(false))  //获取所有attributes
                {
                    if (attribute.GetType() == typeof(TestFieldAttribute))
                    {
                        if ((attribute as TestFieldAttribute).IsIgnore == true)     //成员有ignore则可以忽略write标志
                            Console.WriteLine("Output:" + writer.Num.ToString());
                    }
                }
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            var demoA = new TestDemoA();
            demoA.Num = 10;

            var demoB = new TestDemoB();
            demoB.Num = 20;

            Writer.Output(demoA);
            Writer.Output(demoB);
            Console.Read();
        }      
    }

 

  看来马上要学习一下 C# 的反射原理了。

 

posted on 2016-09-01 11:02  青墨淡潋  阅读(232)  评论(0)    收藏  举报