這個問題來自論壇提問,對於初學者來說確實比較陌生,msdn參考文檔
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;
}
}