• 特性


    (一)概念:


    是用于在执行时传递程序中各种元素(比方类、方法、结构、枚举、组件等)的行为信息的声明性标签。

    能够通过使用特性向程序加入声明性信息。

    也就是说,也行就是向程序加入声明性信息,程序能够解析这些声明性信息。进行对这些信息作出反应,我的理解。


    (二)类型:


    分为两种类型:提前定义和自己定义。


    提前定义特性:


    .NET框架提供了三种提前定义特性:


    1、AttributeUsage:描写叙述了怎样使用一个自己定义特性。

    2、Conditional:其运行依赖于它的预处理标示符,也就是说。打上特性后,就会限制该方法是否被调用。

    3、Obsolete:这个提前定义标记了不应别使用的程序实体,也就是说。打上标签后,限制该方式时候过期。


    自己定义特性:


    自己定义须要的4个步骤:


    1、声明自己定义特性


    <span style="font-size:18px;">// 一个自己定义特性 BugFix 被赋给类及其成员
    [AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Constructor |
    AttributeTargets.Field |
    AttributeTargets.Method |
    AttributeTargets.Property,
    AllowMultiple = true)]
    
    public class DeBugInfo : System.Attribute</span>

    2、构建自己定义特性


    <span style="font-size:18px;">// 一个自己定义特性 BugFix 被赋给类及其成员
    [AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Constructor |
    AttributeTargets.Field |
    AttributeTargets.Method |
    AttributeTargets.Property,
    AllowMultiple = true)]
    
    public class DeBugInfo : System.Attribute
    {
      private int bugNo;
      private string developer;
      private string lastReview;
      public string message;
    
      public DeBugInfo(int bg, string dev, string d)
      {
          this.bugNo = bg;
          this.developer = dev;
          this.lastReview = d;
      }
    
      public int BugNo
      {
          get
          {
              return bugNo;
          }
      }
      public string Developer
      {
          get
          {
              return developer;
          }
      }
      public string LastReview
      {
          get
          {
              return lastReview;
          }
      }
      public string Message
      {
          get
          {
              return message;
          }
          set
          {
              message = value;
          }
      }
    }</span>


    3、应用自己定义特性:


    <span style="font-size:18px;">[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
    [DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")]
    class Rectangle
    {
      // 成员变量
      protected double length;
      protected double width;
      public Rectangle(double l, double w)
      {
          length = l;
          width = w;
      }
      [DeBugInfo(55, "Zara Ali", "19/10/2012",
      Message = "Return type mismatch")]
      public double GetArea()
      {
          return length * width;
      }
      [DeBugInfo(56, "Zara Ali", "19/10/2012")]
      public void Display()
      {
          Console.WriteLine("Length: {0}", length);
          Console.WriteLine("Width: {0}", width);
          Console.WriteLine("Area: {0}", GetArea());
      }
    }</span>

    4、通过反射获取值


    <span style="font-size:18px;">  class ExecuteRectangle
       {
          static void Main(string[] args)
          {
             Rectangle r = new Rectangle(4.5, 7.5);
             r.Display();
             Type type = typeof(Rectangle);
             // 遍历 Rectangle 类的属性
             foreach (Object attributes in type.GetCustomAttributes(false))
             {
                DeBugInfo dbi = (DeBugInfo)attributes;
                if (null != dbi)
                {
                   Console.WriteLine("Bug no: {0}", dbi.BugNo);
                   Console.WriteLine("Developer: {0}", dbi.Developer);
                   Console.WriteLine("Last Reviewed: {0}",
    					dbi.LastReview);
                   Console.WriteLine("Remarks: {0}", dbi.Message);
                }
             }
             
             // 遍历方法属性
             foreach (MethodInfo m in type.GetMethods())
             {
                foreach (Attribute a in m.GetCustomAttributes(true))
                {
                   DeBugInfo dbi = (DeBugInfo)a;
                   if (null != dbi)
                   {
                      Console.WriteLine("Bug no: {0}, for Method: {1}",
    						dbi.BugNo, m.Name);
                      Console.WriteLine("Developer: {0}", dbi.Developer);
                      Console.WriteLine("Last Reviewed: {0}",
    						dbi.LastReview);
                      Console.WriteLine("Remarks: {0}", dbi.Message);
                   }
                }
             }
             Console.ReadLine();
          }
       }
    }</span>


    执行的结果:


    <span style="font-size:18px;">Length: 4.5
    Width: 7.5
    Area: 33.75
    Bug No: 49
    Developer: Nuha Ali
    Last Reviewed: 10/10/2012
    Remarks: Unused variable
    Bug No: 45
    Developer: Zara Ali
    Last Reviewed: 12/8/2012
    Remarks: Return type mismatch
    Bug No: 55, for Method: GetArea
    Developer: Zara Ali
    Last Reviewed: 19/10/2012
    Remarks: Return type mismatch
    Bug No: 56, for Method: Display
    Developer: Zara Ali
    Last Reviewed: 19/10/2012
    Remarks: </span>

    总结:


    在实际的应用中,特性作为类或者方法或属性的声明性信息,让程序进行处理。





  • 相关阅读:
    ubuntu14.04server下安装scala+sbt工具
    如何在Ubuntu server中修改IP
    机器学习涉及到的数学知识
    Openfire+spark在linux上搭建内部聊天系统
    ubuntu14.04server版安装redis
    网站流量统计
    Visual Studio-使用vs2015 调用 vs2010编译的库时解决"无法解析的外部符号__iob_func 问题"
    书签中的一些工具整理
    android开发学习——day3
    android开发学习——day2
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5061183.html
Copyright © 2020-2023  润新知