C#_反射與特性
程序集

經(jīng)過編譯器編譯得到的產(chǎn)物(.exe/.dll)
是自己寫的代碼集合

元數(shù)據(jù)

用來描述程序集的數(shù)據(jù)單元

反射

可以在程序運行時,可以查看其他程序集或者自身的元數(shù)據(jù)
提高了程序的拓展性和靈活性
using System.Reflection命名空間下
using System

Type【類的信息類】
Assembly【程序集類】
Activator【實例化對象的類】

.GetType();//在xx命名空間下的.xx
Type t=typeof(int);//在xx命名空間下的xx
Type.GetType();//【參數(shù)】System.Int32(需要包含命名空間)
以上的三種方法指向的是同一個引用內(nèi)存地址

【得到所有的公共成員】:MemberInfo[] m=t.GetMembers();

【得到所有的構(gòu)造方法】:ConstructorInfo[] info=t.GetConstructors();
【得到一個的構(gòu)造方法】:ConstructorInfo info=t.GetConstructor(new Type[0]);【參數(shù)】有長度的Type類型數(shù)組,長度0則為無參構(gòu)造。?info.Invoke();//【參數(shù):null】執(zhí)行得到的構(gòu)造方法,返回object對象(需要as得到引用對象)
【得到有參的構(gòu)造方法】:ConstructorInfo info=t.GetConstructor(new Type[]{typeof(int)}); //一個int類型的構(gòu)造方法;info.Invoke(new Type[]{2});?//【參數(shù)】傳入2返回object對象(需要as得到引用對象){同理:兩個參數(shù)的構(gòu)造函數(shù)時,需要按照順序typeof(int),typeof(string)}
【得到所有的成員變量】:FieldInfo[] f=t.GetFields();
【得到一個成員變量】:FieldInfo?f=t.GetField("age");//【參數(shù)】變量名得到引用
【得到成員變量的內(nèi)容】:f.GetValue(obj);//【參數(shù)】為該變量類型的實例
【設(shè)置成員變量的內(nèi)容】:f.SetValue(obj,10);//【參數(shù)】1.實例2.更改obj的值,若[枚舉則為.GetValue(null),先得成員后訪問]
【得到公共的成員方法】:Method[] f=t.GetMethods();//得到對應(yīng)有參數(shù)的成員方法和構(gòu)造方法的方式一致
【得到一個成員方法】:Method?f=t.GetMethod("FunName");//【參數(shù)】方法名得到引用,f.Invoke(類型實例(如果為靜態(tài)方法為null),new Type[]{10,10});
【枚舉、事件、接口】

Activator實例化
得到Type t=typeof(MyClass);
Activator.CreateInstance(t);//【參數(shù)】為對象信息類,返回object對象(需要as)默認為無參構(gòu)造
Activator.CreateInstance(t,2,“222”);//【參數(shù)】為對象信息類,返回object對象(需要as)默認為無參構(gòu)造,后面為對應(yīng)參數(shù),不對應(yīng)則報錯
Assembly【程序集類】
Assembly asem= Assembly.Load();//同個工程文件下程序集名稱
Assembly asem= Assembly.LoadFrom();//加載指定路徑下的.dll【使用@取消轉(zhuǎn)移字符或者\\】用Type[]進行裝置遍歷
Assembly asem= Assembly.LoadFile();

特性

What
是一種允許我們向程序的程序集添加一些元數(shù)據(jù)的語言結(jié)構(gòu),用于保存程序結(jié)構(gòu)信息的某種特殊類型的類
提供了強大的方法聲明信息與代碼的其他元數(shù)據(jù)相關(guān)聯(lián),可以在運行時使用反射來查詢特性的相關(guān)信息描述
目的是提供編譯器把某些元數(shù)據(jù)進行特殊處理,本質(zhì)是一個類
Why
提供某些特殊需求
How
【定義】該類需要繼承Attribute才能自定義特性名字后面需亞添加Attribute表示是特性,在使用時Attribute會被省略
【調(diào)用】
[MyTest("特性測試")],判斷Type對象有沒有有沒有對應(yīng)的特性,t.IsDefined(typeof(自定義的特性類名),bool是否搜索繼承鏈)//可以傳成員等
t.GetCustomAttribues(ture)//獲取元數(shù)據(jù)中的所有特性 返回object對象數(shù)組可以遍歷去判斷做特殊處理(as 為對應(yīng)的類進行調(diào)用對應(yīng)的成員)
【限定使用范圍】為特性類再加[AttributeUsage()][參數(shù)]1.可以使用在哪里可以用位運算符進行處理2.是否多個特性實例用在同一個目標上3.特性是否能被派生類重寫和繼承
【過時特性】[obsolete("該方法已經(jīng)過時,請使用GetAaxis方法",bool調(diào)用是否會報錯)]
【調(diào)用者信息特性】一般用在處理異常的Try中,System.Runtime.CompilerServices;
【條件編譯特性】[Conditional("Fun")]System.Diagnostic,結(jié)合#define Fun進行使用,主要用在調(diào)試代碼
【外部Dll包特性】System.Runtime.InteropServices;//調(diào)用C/C++寫好的函數(shù),[DllImport(“路徑.dll”)]
public static extern int Add(int a,int b);//進行函數(shù)映射