c# Attribute(特性) 研究

MSDN说明:


      特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。 特性与程序实体关联后,即可在 运行时使用名为 “反射”的技术查询特性。

特性具有以下属性:


特性可向程序中添加元数据。 元数据是有关在程序中定义的类型的信息。 所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员。 可以添加自定义特性,以指定所需的任何附加信息。 

可以将一个或多个特性应用到整个程序集、模块或较小的程序元素(如类和属性)。


特性可以与方法和属性相同的方式接受参数。

程序可以使用反射检查自己的元数据或其他程序内的元数据。



以上注意红色文字“运行时”和“反射”

要说在编辑器给代码添加注释(如:string UserID;  //用户名),那么Attribute(特性)就是在程序运行的时候添加注释。所谓的程序运行的时候添加注释,到底是什么意思呢?那就要说“反射”了。

看例子:

 public class attrClass //定义一个类
      {
        public void Fun1()
         { }
        public void Fun2()
        { }
          public void Fun3()
         { }
    }




  class Program //控制台启动程序测试反射结果
      {
          public static void Main(string[] args)
         {
            Type type = typeof(TestClass);                 //TestClass获取类型
            foreach (MethodInfo method in type.GetMethods())        //反射   ,获取TestClass类的所有公共方法
            {
                    Console.WriteLine("{0} is Function.", method.Name);        //打印的名字
            }
            Console.Read();
        }
     }

运行时,

控制台打印结果

Fun1 is Function.
Fun2 is Function.
Fun3 is Function.
ToString is Function.          //所有类继承自object,object公共方法
Equals is Function.            //所有类继承自object,object公共方法
GetHashCode is Function.          //所有类继承自object,object公共方法
GetType is Function.                       //所有类继承自object,object公共方法


从上面可以看出,我们在运行时 ,通过“反射”  获取了TestClass类的公共方法。

但是你只在运行时反射”获得了方法,却不知道方法是干什么的。现在我想在运行时,让反射的方法添加方法的使用说明,那该怎么办呢?相信你已经知道了,使用 Attribute

(特性)。

在上面的例子中,假如Fun1()方法是做第一件事情,Fun2()方法是做第二件事情,Fun3()方法是做第三件事情。我们就可以使用特性描述每个方法的作用。

现在我们改写代码:


添加特性类:

    public class AttrTestAttribute : Attribute
    {
        public string funName;
        public string action;
        public AttrTestAttribute(string funName,string action)
        {
            this.funName = funName;    //描述方法的名字
            this.action = action;        //描述方法的作用


        }

    }


然后改写上面的TestClass类:


    public class TestClass
    {
        [AttrTest("Fun1","做第一件事")]
        public void Fun1()
        { }
        [AttrTest("Fun2", "做第二件事")]
        public void Fun2()
        { }
        [AttrTest("Fun3", "做第三件事")]
        public void Fun3()
        { }
    }



  class Program //控制台启动程序测试反射结果
      {
          public static void Main(string[] args)
         {

           Type type = typeof(TestClass);
            foreach (MethodInfo method in type.GetMethods())
            {
                AttrTestAttribute at = (AttrTestAttribute)Attribute.GetCustomAttribute(method, typeof(AttrTestAttribute));     //获取方法的AttrTestAttribute 特性 的注释描述
                if (at != null)          //如果是AttrTestAttribute 特性 的注释描述
                    {
                    Console.WriteLine("{0} function nameis {1} action:{2}", method.Name,at.funName,at.action);
                }
            }
            Console.Read();


        }
     }



控制台打印结果

Fun1 function nameis Fun1 action:做第一件事
Fun2 function nameis Fun2 action:做第二件事
Fun3 function nameis Fun3 action:做第三件事



通过上面的代码测试  ,Attribute(特性)作用是运行时,与“反射”获取方法、属性等对象绑定,用来描述反射的方法、属性等对象的特征,作用。如上面我们使用特性分别描述

fun1、fun2、fun3的作用。 

Attribute(特性)的作用是  在使用反射时  ,告诉开发者“反射”的方法、属性等成员的使用方法,和方法的功能信息 。有人问为什么要有特性,感觉没用。

其实是这样,如果你已经写好了一个程序集,生成了一个dll文件,此时你无法再看里面的源代码,但是为了特殊环境需要,你还想让第三方使用此dll,但不想让他看源码,此时,第三方可以使用反射的方法  ,把你的dll里面的方法反射出来,但是又遇到一个问题,第三方虽然获得了方法,但是不知道怎么用,这是就可以使用特性来为方法添加

注释性的描述。说的更通俗一点,Attribute(特性)就是方法、字段、属性等成员的(描述)属性。















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值