zoukankan      html  css  js  c++  java
  • 3.C#中通过反射来获取Attribute中的信息

      阅读目录

      一:属性

      二:自定义属性类BookAttribute实例

      . 属性是由属性类来实现的,向上篇文章《C#温故而知新学习系列之.NET框架高级特性—.NET框架中自身提供的属性(二)》我们讲的Obsolete一样,我们还可以自定义属性类,属性类是由System.Attribute派生而来的

      . 在C#中为了方便起见,使用自定义属性时可以省略属性名后面的Attribute,比如:下面讲到的[BookAttribute("自定义属性类")]可以改写为[Books("自定义属性类")]

      . 自定义属性类的特点

      1:使用AttributeUsage属性可以限制属性的用法

      AttributeUsage属性包含一个名为AttributeTargets的枚举可以用于指定何处使用自定义的属性,比如:指定属性仅用于类和结构[AttributeUsage(AttributeTargets.Class|AttributeTargets.Struct)]

      2:使用AttributeUsage属性可以指定是否可以多次使用属性

      在AttributeUsage属性中通过指定AllowMultiple参数的值可以确定是否可以多次使用属性,AllowMultiple值为true表示可以多次使用属性,AllowMultiple值为false表示只能使用一次属性,比如:[AttributeUsage(AllowMultiple=true)]

      3:可以设置属性参数

      在属性类的构造函数中给出的参数列表即为属性参数

      二:自定义属性类BookAttribute实例

      1:BookAttribute.cs

      namespace CustomAttributeClass
      {
          //仅限用于类,且可以多次使用属性
          [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
          //继承自Attribute类
          class BookAttribute:Attribute
          {
              private string _bookname;//私有字段

         /// <summary>
              /// 书本名称属性
              /// </summary>
              public string BookNmae
              {
                  get { return _bookname; }
                  set { _bookname = value; }
              }
              //构造函数,设置属性参数
              public BookAttribute(string strBookName)
              {
                  this._bookname = strBookName;
              }
          }
      }

      2:BookInfo.cs

      namespace CustomAttributeClass
      {

         //多次使用属性类
          [Book("ASP.NET深入剖析系列")]
          [Book("C#完全学习手册")]
          class BookInfo
          {
              public string bookinfo = "图书信息如下";
              //构造函数
              public BookInfo()
              {

              }
          }
      }

      3:Program.cs

         static void Main(string[] args)
            {
                BookInfo bookinfo = new BookInfo();
                object[] bookarr;//对象数组
                //获取对象类型,使用typeof方法检索当前的类类型也就是BookInfo
                MemberInfo typeinfo = typeof(BookInfo);
        //调用GetCustomAttributes方法获取与BookAttribute类有关的属性列表,该方法返回一个对象数组
                bookarr = typeinfo.GetCustomAttributes(typeof(BookAttribute), false);
                if (bookarr.GetLength(0) != 0)
                {
                    BookAttribute bookattribute1 = (BookAttribute)bookarr[0];//获取属性类的第一个成员
                    BookAttribute bookattribute2 = (BookAttribute)bookarr[1];//获取属性类的第一个成员
                    Console.WriteLine(bookinfo.bookinfo);
                    Console.WriteLine("图书名称为:" + bookattribute1.BookNmae + "—" + bookattribute2.BookNmae);
                    Console.ReadKey();
                }
            }

      

      

  • 相关阅读:
    Shell编程进阶 1.2 shell结构及执行
    LNMP 1.6 常见的502问题解决
    关于贴图看不到。显示是白色或者其他。
    windows 任务栏图标宽度固定
    Install Oracle Java JDK/JRE 7u55 on Fedora 20/19, CentOS/RHEL 6.5/5.10
    盘点天龙历史:七年以来所有资料片
    linux shell 逻辑运算符、逻辑表达式详解
    vim 把满足条件的数字进行加上一些数字
    win7 一些快捷系统工具命令
    Linux下用C读取配置文件。类似ini这样。
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2432391.html
Copyright © 2011-2022 走看看