欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Attribute

程序员文章站 2022-07-14 13:03:00
...
①声明自定义特性,以Attribute 结尾,继承Attribute ,一般声明成私密类
//可以有构造函数,字段,属性
/// <summary>
       /// 限制特性使用
       /// </summary>
       [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor)]//限制特性使用
       public sealed class MyAttributeAttribute : Attribute
       {
           public string Description { get; set; }

           public string VersionNumber { get; set; }

           public string Reviewer { get; set; }

           /// <summary>
           /// 构造函数只能在贴特性的时候使用;
           /// 使用时可以用位置参数和命名参数来构成,如 [MyAttribute(desc,ver,Reviewer="rev")]
           /// </summary>
           public MyAttributeAttribute(string desc, string ver)
           {
               Description = desc;
               VersionNumber = ver;

           }

       }
②限制特性使用:AttributeUsage
 //AttributeUsage有3个重要属性,ValidOn(保存特性能应用到的目标类型的列表。构造函数的第一个参数必须是AttributeTarget类型的枚举值),Inherited(一个布尔值,指示特性是否会被装饰类型的派生类所继承),AllowMutiple(指示目标是否被引用多个特性的实例的布尔值)
   //AttributeUsage 构造函数接收单个位置参数,表示该特性能贴到的目标类型,就是ValidOn;我们可以使用按位或运算来组合使用类型
  [AttributeUsage(
           AttributeTargets.Method | AttributeTargets.Constructor,
           Inherited=false,//可选的,命名参数
           AllowMultiple = false)]//可选的,命名参数

访问特性:得到特性之后,我们就能根据特性的对象获取由构造函数贴进去的属性值 

③访问特性IsDefined
  [AttributeUsage(AttributeTargets.Class)]
       public sealed class ReviewCommentAttribute : Attribute
       {
           public string VersionNumber { get; set; }
           public string Reviewer { get; set; }
           public ReviewCommentAttribute(string Rev, string ver)
           {
               Reviewer = Rev;
               VersionNumber = ver;
           }


       }
        [ReviewComment("check it out","2.4")]
        public class TestAttribute
        {

        }
 static void Main(string[] args)
        {
            TestAttribute tt = new TestAttribute();
            Type type = tt.GetType();
            bool isDefined= type.IsDefined(typeof(ReviewCommentAttribute), false);
            if (isDefined)
            {
                Console.WriteLine("ReviewComment is Applied to type {0}");
                
            }   
}
④访问特性GetCustomAttributes方法
   1.typeof.GetCustomAttribute(typeof(TestAttribute ),false);
   2.//GetCustomerAttribute 方法返回应用到结构特性的数组,因为是object[],所以我们需要强转转为相应的特性类型
 Type type= typeof(TestAttribute);
            object[] AttArr = type.GetCustomAttributes(false);
            foreach (Attribute a in AttArr)
            {
                ReviewCommentAttribute attr = a as ReviewCommentAttribute;
                if (null!=attr)
                {
                    Console.WriteLine("VersionNumber:{0}",attr.VersionNumber);
                    Console.WriteLine("Reviewer:{0}", attr.Reviewer);
                    Console.WriteLine("Description:{0}", attr.Description);

                }
            }

  

上一篇: attribute

下一篇: GNU gcc编译器