入門反射(二)

這篇來看一下反射的使用!舉個例子!編程

舉例子,確定須要一個類,先建一個學生類:數組

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);//輸出屬性名稱

輸出結果爲:spa

Id
Name
Sex

GetProperties能夠獲取類型中全部的公用屬性,返回一個屬性信息數組PropertyInfo(類型中的公用屬性>= 0 ,用數組),3d

返回一個屬性信息數組,咱們循環輸出了它公用屬性的名稱。code

獲取全部公用字段字段(GetFields)

Type t = typeof(Student);//獲取類型
FieldInfo[] fields = t.GetFields(); //獲取全部公用字段
foreach (var f in fields)
    Console.WriteLine(f.Name);//輸出

 輸出結果爲:對象

Status

Student裏的公用字段Status輸出了。blog

GetFields能夠獲取類型中全部的公用字段,返回的是一個字段信息數組(類型中的公用字段>=0的,用數組),而後咱們把這個數組進行循環輸出。

獲取所公用方法(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

GetMethods能夠獲取類型中全部的公用方法,返回一個方法信息數組(MethodInfo[]),咱們循環輸出公用方法的名稱。

不但輸出了Show公用方法,還輸出了public 類型 字段名{ 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()方法

輸出結果爲:

姓名:小明

╭(╯^╰)╮,你會發現我並無經過stu對這個Name屬性賦值,就進行輸出,輸出內容顯示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,各類貼吧找到的知識理解了下,就寫了幾篇博客記錄一下。

多是反射已經再也不被常常使用,或者他的性能略差被替換,或許他的存在位於框架比較多,可是他的確是一個很是又去而且讓人有所思考的東西。

在下學疏才淺,錯誤在所不免,若是有錯誤請各位大佬指出。多謝!

相關文章
相關標籤/搜索