step one:(找入口) using System.Reflection; //引用需要用到的命名空間 做任何事都要有開始的地方,不例外,反射也要先找到反射的入口,舉個慄子: Assembly assemble = Assembly.Load("SqlServer"); //反射的入口::動態的 ...
step one:(找入口)
using System.Reflection; //引用需要用到的命名空間
做任何事都要有開始的地方,不例外,反射也要先找到反射的入口,舉個慄子: Assembly assemble = Assembly.Load("SqlServer"); //反射的入口::動態的載入dll
step two:(獲類型)
載入完DLL之後,根據類的完整名稱找到類型,再舉個慄子: Type type = assemble.GetType("SqlServer.Class1"); //SqlServer.Class1就是SqlServer中的一個類
知道類之後可以通過迴圈遍歷找到類中所有的方法名:
Console.WriteLine("*************GetMethods**************"); foreach (MethodInfo method in type.GetMethods()) { Console.WriteLine("名稱{0}",method.Name); }
step three:(搞對象)
下麵就要根據step two中獲取的類型創對象,有了對象一切就都好辦了,舉例:object oBject = Activator.CreateInstance(type); //根據類型,創建對象,由於不知道對象類型所以只能object
再下來就是使用對象了,圍繞著對象做一些事情
具體的使用方法舉慄:
MethodInfo show1 = type.GetMethod("show1",new Type[] { }); //show1是類中的方法且是無參的 show1.Invoke(oBject,null); MethodInfo show2 = type.GetMethod("show2", new Type[] { typeof(int) }); //show2方法是有參數的 show2.Invoke(oBject, new object[] { 22});
要放大招了,準備好!````````````````````````````````````````````````````````````````````簡直黑科技
你知道嗎,通過反射可以調用類的私有方法,只能說也是賊溜了。
MethodInfo show3 = type.GetMethod("show3", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);//通過反射調用私有方法 show3.Invoke(oBject, null);
附上SqlServer.Class1的代碼:
1 public void show1() 2 { 3 4 Console.WriteLine("方法是{0}",this.GetType()); 5 6 } 7 8 public void show2(int id) 9 10 { 11 12 Console.WriteLine("這是show2方法(有參的){0}",id); 13 14 } 15 16 private void show3() 17 { 18 Console.WriteLine("這是私有方法{0}",this.GetType()); 19 }
同理 運用反射操作表結構----------------------------------------------------------
1.命名空間下的元素的預設訪問修飾符
public : 同一程式集的其他任何代碼或引用該程式集的其他程式集都可以訪問該類型或成員。
internal : 同一程式集中的任何代碼都可以訪問該類型或成員,但其他程式集不可以訪問。
2.各類型中的成員的預設訪問修飾符
剩下的修飾符主要是正對繼承這個語言特性的,擁有繼承的類型有兩個類(class)和介面(interface)。public,internal同樣可以用於類型成員。
private : 同一類和結構的代碼可以訪問該類型和成員。
protected : 同一類和派生(繼承特性)類中的代碼可以訪問該類型和成員。
protected internal : 同一程式集中的任何代碼或其他程式集中的任何派生類都可以訪問該類型或成員。
MSDN提示 :
1.) 派生類的可訪問性不能高於其基類型。換句話說,不能有從內部類 A 派生的公共類 B。如果允許這種情況,將會使 A 成為公共類,因為 A 的所有受保護的成員或內部成員都可以從派生類訪問。
2.) 成員的可訪問性決不能高於其包含類型的可訪問性。
3.) 可以使用五種訪問類型中的任何一種來聲明類成員(包括嵌套的類和結構)。
介面(interface)
介面成員訪問修飾符預設為public,且不能顯示使用訪問修飾符。
類(class)
構造函數預設為public訪問修飾符。
析構函數不能顯示使用訪問修飾符且預設為private訪問修飾符。
類的成員預設訪問修飾符為private;
枚舉(enum)
枚舉類型成員預設為public訪問修飾符,且不能顯示使用修飾符。
結構(struct)
結構成員預設為private修飾符。
結構成員無法聲明為protected成員,因為結構不支持繼承。
嵌套類型
嵌套類型的預設訪問修飾符為private。 和類,結構的成員預設訪問類型一致。