当前位置:首页 > C#教程 > C#高级

C#特性的简单介绍

 特性应该我们大多接触过,比喻经常使用的[Obsolete],[Serializable]等下面我就主要介绍一个特性的一些用法

摘自MSDN定义:用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。 ">

意思就是把我们自定义的特性或者微软自带的特性和我们的代码进行组合,其实就是为我们某些代码附加一些信息

1:先看.Net带的三种特性

1.1:[Obsolete]这个预定义特性标记了不应被使用的程序实体

  • 参数 message,是一个字符串,描述项目过时原因以及特带的项目。
  • 参数 error,是一个布尔值。如果该值为 true,编译器应把该项目的使用当作一个错误。默认值是 false(编译器生成一个警告)。
                 [Obsolete("过时方法")]
        privatestaticvoid OutModed()
        {
            Console.WriteLine("我是过时的方法");
        }

然后引用的时候就出现技术分享

如果加上false我们发现在引用的使用就没法编译过去大家可以自己试验下

1.2:[Conditional]这个预定义特性指示编译器应忽略方法调用或属性,除非已定义指定的条件编译符号

  • 参数 conditionString,获取与 ConditionalAttribute 属性相关的条件编译符号

 

            private
            static
            void Main(string[] args)
        {
            Debug();
            Trace();
            
        }

        [Conditional("DEBUG")]
        privatestaticvoid Debug() {
            Console.WriteLine("我是debug");
        }

        [Conditional("TRACE")]
        publicstaticvoid Trace()
        {
            Console.WriteLine("我是TRACE");
        }

当调试成trace模式的时候只能结果:

技术分享

1.3:[AttributeUsage]描述了如何使用一个自定义特性类。并加上限制

  • 参数AttributeTargets 指定可以对它们应用特性的应用程序元素
  • 参数allowMultiple 指示该特性是单用还是多用  默认false
  • 参数inherited是否可以继续 默认true

创建一个自定义特性

            [AttributeUsage(AttributeTargets.Method)]
    
            public
            class
             CustomAttribute:Attribute
    {
        
            public
            string Name { get; set; }

        public CustomAttribute(string name)
        {
            Name = name;
        }
    }

上面的限制是只能用于方法

     [Custom()]//报错internalclass Program
    {
        privatestaticvoid Main(string[] args)
        {       
        }

allowMultiple = false。它规定了特性不能被重复放置多次所以下面代码会报错

        [Custom("1")] //报错
        [Custom("2")]
        publicvoid Method()
        {
        }

 2:自定义特性

先定义一个特性类

    [AttributeUsage(AttributeTargets.All,AllowMultiple = true,Inherited = false)]
    publicclass CustomAttribute:Attribute
    {
        publicstring Name { get; set; }

        publicint Age { get; set; }

        public CustomAttribute(string name,int age)
        {
            Name = name;
            Age = age;
        }
    }

然后定义一个基类

[Custom("张三", 3)]
    publicclass Base
    {        
        publicstaticvoid Method()
        {
            Console.WriteLine("我具有一个特性");
        }        
    }
            public
            static
            void
             GetAttributeInfo(Type t) {
            
            var myattribute = (CustomAttribute)Attribute.GetCustomAttribute(t, typeof(CustomAttribute));
            if (myattribute!=null)
            {
                Console.WriteLine("姓名:{0}n年龄:{1}", myattribute.Name, myattribute.Age);
            }    
        }

调用

GetAttributeInfo(typeof(Base));

技术分享

 

            public
            class
             Base
    {     
       [Custom(
            "
            张三
            ", 3)]//方法上   
        publicstaticvoid Method()
        {
            Console.WriteLine("我具有一个特性");
        }        
    }

就改变t的写法:t.GetMethod("Method")这样来获取特性运行效果一样

 

原文:http://www.cnblogs.com/LipeiNet/p/4978276.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!