特性本質上是一個類,其爲目標元素提供關聯附加信息,並在運行期以反射的方式來獲取附加信息;(attribute和.net framework 文件的元數據保存在一塊兒,能夠用來在運行時描述你的代碼,或者在程序運行的時候影響應用程序的行爲)所謂的定製特性就是爲目標元素,能夠是數據集,類,方法,屬性,相似於註釋,可是能夠在運行期以反射的方式得到,定製特性主要應用在序列化,編譯器指令,設計模式等方面;c#
目標元素包括:assembly module type property event field method param return
(其實關於數組來接受任意長度的參數就是用特性來作出來的)
其在編譯期進行初始化而不是運行期;設計模式
幾個習慣用法:
自定義特性必須直接或間接繼承自System.Attribute類並且該類必需要有公有的構造函數;
自定義特性應該有一個Attribute後綴,習慣約定(在調用中能夠省略,會自動匹配);
非抽象特性必需要有public訪問權限;
定製特性不會影響應用元素的任何功能,只是約定了該元素具備的特質;數組
若是沒有什麼機制在運行期獲取attribute的附加信息,那麼attribute就沒有什麼存在的意義,所以 .net中用反射的機制來實如今運行期獲取attribute信息;函數
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Method,AllowMultiple =true , Inherited = true)] (可應用屢次,不能夠繼承到派生類)
public class testAttribute : System.Attribute
{
public string name;
public testAttribute()
{ }
}
[test(name ="itis my first program")]
public class mytext
{
public void ok()
{
Console.WriteLine("my text word!");
}
}
class Program
{
static void Main(string[] args)
{
MemberInfo info = typeof(mytext); //或者對象名.GetType() 獲得的其實是Type類型;
object []attribute;
attribute =info.GetCustomAttributes(typeof(testAttribute), true);
foreach (object a in attribute)
{
testAttribute x = (testAttribute)a;
Console.WriteLine(x.name );
} //獲取對象的屬性
(其實就是人爲付在類體上面的一些說明);.net
Assembly d = Assembly.Load("Mscorlib");
Type[] types = d.GetTypes();
int i = 0;
foreach (Type a in types)
{
Console.WriteLine(a);
Console.Read();
i++;
}
Console.WriteLine(i.ToString ()); //查看一個程序集的內容設計
關於Type:
能夠看做是一個類,但實際上時一個抽象的基類,type於每種數據類型都有對應的Type的派生類,通常派生的類只提供各類Tyep方法和屬性的不一樣重載,以返回對應數據類型的正確數據
獲取指向給定類型的Type引用由3種方式:
·使用c#typeof運算符,參數是類型的名稱;
·使用GetType()方法,全部類都會從object類中繼承這個方法;(肯定該實例的類型)
·調用Type類的靜態方法GetType();對象
type是許多反射技術的入口,可用的屬性都是可讀的,可使用Type肯定數據的類型,但不能修改該類型;
(整個反射機制的樞紐)繼承
反射機制:
第一步:Assembly.Load("")/.LoadFrom("") 加載程序集;
第二步: a.調用.GetTypes(),返回全部該程序集中的類型;
b.或者調用特性靜態方法Attribute.GetCustomAttributes(Assemble x) ,返回該程序集中全部包含的特性
(有一個重載的方法,第二個參數爲指定特性的Type,即返回該程序集全部的該特性的集合)
第三步: a.調用Type的各類屬性,如GetMethods()等,查找制定方法字段屬性的 信息;
b.將特性轉換爲(顯示)已知的特性,再調用特性的方法等;
第四步:用methodinfo 等直接調用GetCustomAttributes ()以得到與該方法有關的特性;ip