學(xué)習(xí)反射中的動態(tài)創(chuàng)建對象
Assembly的CreateInstance有三個重載,***個參數(shù)需要是一個字符串表示的完整的類名。第二個參數(shù)是一個bool類型,如果為true,表示對***個參數(shù)不區(qū)分大小寫。
第三個: 影響執(zhí)行搜索的方式的位屏蔽。此值是 System.Reflection.BindingFlags 中的位標(biāo)志的組合。
// binder: 一個啟用綁定、參數(shù)類型強制、成員調(diào)用以及通過反射進行 MemberInfo 對象檢索的對象。 如果 binder 為 null,則使用默認聯(lián)編程序。 // args: Object 類型的數(shù)組,包含要傳遞給構(gòu)造函數(shù)的參數(shù)。此參數(shù)數(shù)組在數(shù)量、順序和類型方面必須 與要調(diào)用的構(gòu)造函數(shù)的參數(shù)匹配。如果需要默認的構(gòu)造函數(shù),則 args 必須是空數(shù)組或 null。 // culture: 用于控制類型強制的 CultureInfo 的實例。如果這是 null,則使用當(dāng)前線程的 CultureInfo。(例如,這對于將表示 1000 的 String 轉(zhuǎn)換為 Double 值是必需的,因為不同的區(qū)域性以不同的方式表示 1000。 // activationAttributes: 包含一個或多個可以參與激活的屬性的數(shù)組。通常為包含單個 System.Runtime.Remoting.Activation.UrlAttribute 對象的數(shù)組。 |
System.Runtime.Remoting.Activation.UrlAttribute 指定激活遠程對象所需的 URL。有關(guān)客戶端激活的對象的詳細說明,請參見客戶端激活。
Activator類的靜態(tài)方法CreateInstance。
CreateInstance的***個參數(shù)說明是程序集的名稱,為null時表示當(dāng)前程序集;第二個參數(shù)說明要創(chuàng)建的類型名稱。Activator.CreateInstance返回的是一個ObjectHandle對象,必須進行一次Unwrap()才能返回Object類型,進而可以強制轉(zhuǎn)換成我們需要的類型(本例中是MathClass)。ObjectHandle包含在System.Runtime.Remoting命名空間中,可見它是Remoting相關(guān)的,實際上ObjectHandle類只是一個對原類型進行了一個包裝以便進行封送。
無參構(gòu)造:
有參構(gòu)造:
動態(tài)調(diào)用 :
.使用InvokeMember調(diào)用方法
InvokeMember("方法名", BindingFlags.InvokeMethod, null,對象實例,方法參數(shù));
靜態(tài):InvokeMember("方法名", BindingFlags.InvokeMethod, null,'類型Type',方法參數(shù));
.MethodInfo.Invoke調(diào)用方法
MethodInfo mi = t.GetMethod("方法名"", BindingFlags.Instance | BindingFlags.Public);
mi.Invoke(對象實例, null);
靜態(tài)
MethodInfo mi1 = t.GetMethod("方法名"", BindingFlags.Static | BindingFlags.Public);
Mi1.Invoke(null, 方法參數(shù) );
用反射可以達到***程度上的多態(tài)
【編輯推薦】