C#中的属性类(Attribute类)

来源:互联网 发布:有粤语听书软件 编辑:程序博客网 时间:2024/05/17 03:56

http://msdn.microsoft.com/zh-cn/library/system.attribute.ASPx

我们先直观的表达一下他的作用之一:

  比如一个自定义Windows控件的DefaultEvent可以表示一个控件默认事件:

  如你双击form他会默认到onLoad事件中,双击button,他会默认到onclick事件中。

  一个简单的测试,你添加一个Windows窗体1叫Form1,然后增加如下代码

  [DefaultEvent("FormClosed")]

  public partial class Form1 : Form

  然后新建一个窗体2,继承自窗体1

  public partial class Form2 : Form1然后把Form2切换到设计器的模式,然后双击Form2的工作区域,会直接定位到代码的 private void Form2_FormClosed(object sender,FormClosedEventArgs e)
    ...{
  
    }而不是先前的 private void Form2_Load(object sender, EventArgs e)
    ...{
    }

  对于这个语法比较好奇的朋友请仔细阅读上面msdn的参考文档.

  简要的说他不是系统规定死的写法,是属性类,

  可以在运行期去决定做什么,就像一般的类.

  除了系统已经定义的还可以自己定义.

  中括号中的语法其实就是一个类的构造函数的调用.

  我们可以通过反射得到属性类的实例.

  属性类可以修饰类,变量,属性,成员函数,事件等

  运行下面的测试代码,可能更加直观的理解他,下面展现了如何自己定义属性类并使用.

using System;using System.Collections.Generic;using System.Text;  namespace ConsoleApplication11...{  class Program  ...{    static void Main(string[] args)    ...{      //获取类上的属性类      foreach (object obj in typeof(TestClass).GetCustomAttributes(false))      ...{        Console.WriteLine(obj.GetType().Name + ":" + obj.ToString());      }      //获取字段属性类      foreach (object obj in typeof(TestClass).GetField("_aa").GetCustomAttributes(typeof(Test1), true))      ...{        Console.WriteLine(obj.GetType().Name + ":" + obj.ToString());      }      //获取属性属性类      foreach (object obj in typeof(TestClass).GetProperty("aa").GetCustomAttributes(typeof(Test1), true))      ...{        Console.WriteLine(obj.GetType().Name + ":" + obj.ToString());      }      //获取方法属性类      foreach (object obj in typeof(TestClass).GetMethod("test").GetCustomAttributes(typeof(Test1), true))      ...{        Console.WriteLine(obj.GetType().Name + ":" + obj.ToString());      }      //获取字事件性类      foreach (object obj in typeof(TestClass).GetEvent("onTest").GetCustomAttributes(typeof(Test1), true))      ...{        Console.WriteLine(obj.GetType().Name + ":" + obj.ToString());      }      Console.Read();    }  }    //测试属性类,传入string  public class Test1 : System.Attribute  ...{    string strName = "";    public Test1() ...{ }    public Test1(string str)    ...{      strName = str;    }    public override string ToString()    ...{      return strName;    }  }  //测试属性类,传入int  public class Test2 : Attribute  ...{    int _f;    public Test2(int f) ...{ _f = f; }    public override string ToString()    ...{      return _f.ToString();    }  }    //给class测试  [Test1("jinjazz for TestClass")]  [Test2(12356)]  public class TestClass  ...{    //给字段和属性测试    [Test1("jinjazz for _aa字段 ")]    public string _aa = "";    [Test1("jinjazz for aa 属性")]    public string aa    ...{      get ...{ return _aa; }    }      //给方法和事件测试    [Test1("jinjazz for test 方法")]    public void test() ...{ }    [Test1("jinjazz for onTest 事件")]    public event System.EventHandler onTest;  }}


原创粉丝点击