動態載入和使用類型
http://msdn2.microsoft.com/zh-cn/library/k3a58006(VS.80).aspx
http://blog.csdn.net/zjghd/archive/2006/09/27/1292739.aspx 反射詳細
讀書筆記之第四章 反射
//通過調用GetEvent和命名事件獲得EventInfo對象EventInfo eventInfo = type.GetEvent("PublicEvent",BindingFlags.Public | BindingFlags.Instance);//通過EventInfo對象調用AddEventHander。AddEventHander需要與執行個體相關聯的處理常式對象,並且System.Delegate由符合EventHandler簽名的方法地址構成和初始化。eventInfo.AddEventHandler(instance, new EventHandler(Handler));//引發事件方法instance.DoEvent();
學習反射機制 c# 有例子
Console.WriteLine("列出程式集中所有類型");
Assembly a = Assembly.LoadFrom("ReflectionExample.exe");
Type[] mytypes = a.GetTypes();
foreach(Type t in mytypes)
{
Console.WriteLine(t.Name);
}
Console.WriteLine("列出HelloWorld中的所有方法");
Type ht = typeof(HelloWorld);
MethodInfo[] mif = ht.GetMethods();
foreach(MethodInfo mf in mif)
{
Console.WriteLine(mf.Name);
}
Console.WriteLine("執行個體化HelloWorld,並調用HelloWorld方法");
Object obj = Activator.CreateInstance(ht);
string[] s = {"wssmax"};
Object objName = Activator.CreateInstance(ht,s);
MethodInfo msayhello = ht.GetMethod("SayHello");
msayhello.Invoke(obj,null);
msayhello.Invoke(objName,null);
Console.ReadLine();
1。反射概述
公用語言運行庫載入器管理應用程式域。這種管理組件括將每個程式集載入到相應的應用程式定義域以及控制每個程式集中類型階層的記憶體布局。
程式集包含模組,而模組包含類型,類型又包含成員。反射則提供了封裝程式集、模組和類型的對象。您可以使用反射動態地建立類型的執行個體,將類型綁定到現有對象,或從現有對象中擷取類型。然後,可以調用類型的方法或訪問其欄位和屬性。反射通常具有以下用途:
- 使用 Assembly 定義和載入程式集,載入在資訊清單中列出的模組,以及從此程式集中尋找類型並建立該類型的執行個體。
- 使用 Module 瞭解如下的類似資訊:包含模組的程式集以及模組中的類等。您還可以擷取在模組上定義的所有全域方法或其他特定的非全域方法。
- 使用 ConstructorInfo 瞭解如下的類似資訊:建構函式的名稱、參數、存取修飾詞(如 public 或 private)和實現詳細資料(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法來調用特定的建構函式。
- 使用 MethodInfo 來瞭解如下的類似資訊:方法的名稱、傳回型別、參數、存取修飾詞(如 public 或 private)和實現詳細資料(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法來調用特定的方法。
- 使用 FieldInfo 來瞭解如下的類似資訊:欄位的名稱、存取修飾詞(如 public 或 private)和實現詳細資料(如 static)等;並擷取或設定欄位值。
- 使用 EventInfo 來瞭解如下的類似資訊:事件的名稱、事件處理常式資料類型、自訂屬性、宣告類型和反射類型等;並添加或移除事件處理常式。
- 使用 PropertyInfo 來瞭解如下的類似資訊:屬性的名稱、資料類型、宣告類型、反射類型和唯讀或可寫狀態等;並擷取或設定屬性值。
- 使用 ParameterInfo 來瞭解如下的類似資訊:參數的名稱、資料類型、參數是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。
System.Reflection.Emit 命名空間的類提供了一種特殊形式的反射,使您能夠在運行時構造類型。
反射也可用於建立稱作類型瀏覽器的應用程式,它使使用者能夠選擇類型,然後查看有關選定類型的資訊。
反射還有其他一些用途。JScript 等語言編譯器使用反射來構造符號表。System.Runtime.Serialization 命名空間中的類使用反射來訪問資料並確定要持久儲存的欄位。System.Runtime.Remoting 命名空間中的類通過序列化來間接地使用反射。
2。動態添加和使用類型
反射提供了由語言編譯器(例如 Microsoft Visual Basic .NET 和 JScript)用來實現隱式晚期綁定的基礎結構。綁定是尋找與唯一指定的類型相對應的聲明(即實現)的過程。由於此過程在運行時而不是在編譯時間發生,所以稱作晚期綁定。Visual Basic .NET 允許您在代碼中使用隱式的晚期綁定;Visual Basic 編譯器將調用一個協助器方法,該方法使用反射來擷取物件類型。傳遞給協助器方法的參數有助於在運行時調用正確的方法。這些參數包括:對其調用方法的執行個體(對象),被呼叫者法的名稱(字串),以及傳遞給被呼叫者法的參數(對象數組)。
以下樣本是動態調用動態連結程式庫中的GetDataSet方法,該方法需要參數string userID
Assembly assembly;
Type type;
string dllPath = @"D:\test\PowerSpace.VCP.Utility.dll";
try
{
assembly = Assembly.LoadFile(dllPath);
type = assembly.GetType("PowerSpace.VCP.Utility.cMyString",true,true);//cMyResult
}
catch(FileNotFoundException)
{
Response.Write("Could not load Assembly: \""+ dllPath +"\"");
Return null;
}
catch(TypeLoadException)
{
Response.Write("Could not load Type: \"string\" \n from assembly: \"" + dllPath + "\""); return null;
}
MethodInfo method = type.GetMethod("TestInvoke");
object obj = Assembly.GetAssembly(type).CreateInstance("PowerSpace.VCP.Utility.GetDataSet");
object s = method.Invoke(obj,new object[]{"jiangli"});
DataSet ss = (DataSet)s;
assembly = null;
type = null;
method =null;
return ss;
3. 訪問自訂屬性
訪問自訂屬性和動態添加和使用類型一樣.