這篇來看一下反射的使用!舉個例子!編程
舉例子,確定須要一個類,先建一個學生類:數組
public class Student {
public int Status; public int Id { get; set; } public string Name { get; set; } public string Sex { get; set; } public void Show() { Console.WriteLine("姓名:{0}", Name); } }
三個屬性,Id,Name,Sex。一個字段Status,一個方法Show.框架
嗯~,破費科特。性能
來看看反射的各個方法或屬性如何使用!學習
Type t = typeof(Student); //獲取類型 PropertyInfo[] pro = t.GetProperties();//獲取公用屬性 foreach (var p in pro) Console.WriteLine(p.Name);//輸出屬性名稱
輸出結果爲:spa
Id
Name
Sex
GetProperties能夠獲取類型中全部的公用屬性,返回一個屬性信息數組PropertyInfo(類型中的公用屬性>= 0 ,用數組),3d
返回一個屬性信息數組,咱們循環輸出了它公用屬性的名稱。code
Type t = typeof(Student);//獲取類型 FieldInfo[] fields = t.GetFields(); //獲取全部公用字段 foreach (var f in fields) Console.WriteLine(f.Name);//輸出
輸出結果爲:對象
Status
Student裏的公用字段Status輸出了。blog
GetFields能夠獲取類型中全部的公用字段,返回的是一個字段信息數組(類型中的公用字段>=0的,用數組),而後咱們把這個數組進行循環輸出。
Type type = typeof(Student);//獲取類型 MethodInfo[] methods = type.GetMethods();//獲取全部公用方法 foreach (var m in methods) Console.WriteLine(m.Name);//輸出方法名
輸出結果爲:
get_Id
set_Id
get_Name
set_Name
get_Sex
set_Sex
Show
GetMethods能夠獲取類型中全部的公用方法,返回一個方法信息數組(MethodInfo[]),咱們循環輸出公用方法的名稱。
不但輸出了Show公用方法,還輸出了public 類型 字段名{ get; set; }中的get與set的公用方法。
Student stu = new Student();//實例化一個Student Type type = stu.GetType(); //獲取Student的類型 PropertyInfo pro = type.GetProperty("Name");//搜索Student里名稱爲Name的公用屬性 pro.SetValue(stu,"小明"); //設置stu裏公用屬性Name爲"小明" stu.Show(); //調用stu.Show()方法
輸出結果爲:
姓名:小明
╭(╯^╰)╮,你會發現我並無經過stu對這個Name屬性賦值,就進行輸出,輸出內容顯示Name已經被賦值了。
這都是拜GetProperty與SetValue所賜。
PropertyInfo pro = 類型.GetProperty(屬性名);
type.GetProperty("Name")能夠搜索類型里名稱爲Name的公用屬性,返回一個屬性信息類 "PropertyInfo "(搜索結果是單一的,不使用數組)
屬性信息.SetValue("對象實例", "值" );
pro.SetValue(stu,"小明");能夠設置stu對象中名稱爲「Name」的屬性信息(pro)值。
這裏設置爲"小明",還須要傳一個對象實例,由於你要指定是哪個實例,不指定的話怎麼能知道你修改的是哪個實例中的Name屬性值呢。
將這個以前咱們先給Student加點東西
public class Student { public int Status; public int Id { get; set; } public string Name { get; set; } public string Sex { get; set; } public void Show() { Console.WriteLine("姓名:{0}", Name); } //新加入 public void Show(int id, string name, string sex) { Console.WriteLine("Id:{0},Name:{1},Sex:{2}", id,name,sex); } }
咱們重載了一個新的Show方法,多了三個參數。
加完方法後,咱們來研究研究這個GetMethod與Invoke
上代碼:
Student stu = new Student(); Type type = stu.GetType(); MethodInfo me = type.GetMethod("Show");//搜索stu對象里名稱爲Show的公用方法 me.Invoke(stu,new object[] { 1,"小明","男"});//調用新加入的Show,傳入三個參數分別對應方法的三個參數
先獲取stu的類型而後使用GetMethod來搜索名稱爲"Show"的公用方法。
最後來調用stu里名稱爲"Show"的方法,而且傳入三個參數(無參數傳入null,有參數傳入object[]數組)
編程過程十分順利,可是運行時報錯!
心裏是崩潰的!
仔細想了想,發現搜索的時候好像就搜索錯誤了。重載了一個三個參數的方法,咱們好像搜索成無參數的方法了。
有參數的方法該怎麼搜索呢?
通過各類詢問與研究後,發現了GetMethod的另外一個重載。
Student stu = new Student(); Type type = stu.GetType(); Type[] types = new Type[] { typeof(int), typeof(string), typeof(string) };//一個Type數組 MethodInfo me = type.GetMethod("Show", types);//搜索stu對象里名稱爲Show的公用方法 me.Invoke(stu,new object[] { 1,"小明","男"});
咱們新建了一個Type[]數組,而後定義了int,string,string三個類型,而後將它傳給了GetMethod方法。
突然發現成功了。咱們在GetMethod中傳入了一個類型數組,規定了搜索方法的參數類型。因此根據這個類型GetMethod就能自動搜索到咱們新重載的方法了。
Id:1,Name:小明,Sex:男
果真不出我所料 ~。~!
學習反射的時間很是少,在書上找到反射的知識點也很是少,在博客園,csdn,各類貼吧找到的知識理解了下,就寫了幾篇博客記錄一下。
多是反射已經再也不被常常使用,或者他的性能略差被替換,或許他的存在位於框架比較多,可是他的確是一個很是又去而且讓人有所思考的東西。
在下學疏才淺,錯誤在所不免,若是有錯誤請各位大佬指出。多謝!