這篇來看一下反射的使用吧!舉個例子! 舉例子,肯定需要一個類啦,先建一個學生例子類: 有三個屬性,Id,Name,Sex。一個欄位Status,還有一個方法Show. 嗯~,破費科特。 來看看反射的各個方法或屬性怎麼使用吧! 獲取類型的公用屬性的方法(GetProperties) 輸出結果為: 是不 ...
這篇來看一下反射的使用吧!舉個例子!
舉例子,肯定需要一個類啦,先建一個學生例子類:
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.
嗯~,破費科特。
來看看反射的各個方法或屬性怎麼使用吧!
獲取類型的公用屬性的方法(GetProperties)
Type t = typeof(Student); //獲取類型 PropertyInfo[] pro = t.GetProperties();//獲取公用屬性 foreach (var p in pro) Console.WriteLine(p.Name);//輸出屬性名稱
輸出結果為:
Id
Name
Sex
是不是把Student類中的公用屬性輸出了。獲取類型後獲取類型中所有的公用屬性(大於等於 1 ,所以用數組),然後迴圈輸出顯示。坡菲克特。
獲取所有公用欄位欄位(GetFields)
Type t = typeof(Student);//獲取類型 FieldInfo[] fields = t.GetFields(); //獲取所有公用欄位 foreach (var f in fields) Console.WriteLine(f.Name);//輸出
輸出結果為:
Status
把Student里的公用欄位Status給輸出了。
GetFields可以獲取類型中所有的公用欄位,返回的是一個欄位信息數組(因為類型中的公用欄位肯定是>=1的,所以要用數組),然後我們把這個數組進行迴圈輸出。
獲取所有公用方法(GetMethods)
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
~~~把整個方法中所有的公用方法都輸出了。而且吧屬性的公用方法都輸出了。看,還測出了public int Id { get; set; }中的get與set的生成規律。
你看到這裡會想整天輸出公用的這個,公用的那個,沒啥用啊,我光知道名字幹啥。
接著往下看吧。。。
GetProperty搜索指定名稱的公用屬性,SetValue設置指定對象的屬性值
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()方法
輸出結果為:
姓名:小明
╭(╯^╰)╮,這個Name屬性被賦值了,而且還輸出了。
這都是拜GetProperty與SetValue所賜。
PropertyInfo pro = 類型.GetProperty(屬性名);
type.GetProperty("Name")可以搜索類型里名稱為Name的公用屬性,返回一個屬性信息類 "PropertyInfo "
屬性信息.SetValue("對象實例", "值" );
pro.SetValue(stu,"小明");可以設置stu對象中名稱為“Name”的屬性信息(pro)值。
這裡設置為"小明",還需要傳一個對象實例,因為你要指定是哪一個實例啊,要不怎麼他怎麼知道你修改哪一個實例的Name屬性值呢。
GetMethod搜索指定名稱的公用方法與Inovke使用指定參數調用當前實例所表示的方法
將這個之前我們先給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,各種貼吧找到的知識理解了下,就寫了幾篇博客記錄一下。
可能是反射已經不再被經常使用,或者他的性能略差被替換,或許他的存在位於框架比較多,但是他的確是一個非常又去並且讓人有所思考的東西。
在下學疏才淺,錯誤在所難免,如果有錯誤請各位大佬指出。多謝!