反射有個典型的應用,就是選單的動態加載,原理就是通過反射呼叫某個表單(類),下面演示一下通過反射呼叫類及方法:
1、新建一個類,命名為:ReflectionHelper,代碼如下:
#region 創建物件實體 /// <summary> /// 創建物件實體 /// </summary> /// <typeparam name="T">物件型別</typeparam> /// <param name="assemblyName">程式集名稱</param> /// <param name="nameSpace">命名空間</param> /// <param name="className">類名</param> /// <returns></returns> public static T CreateInstance<T>(string assemblyName, string nameSpace, string className) { try { //命名空間.類名,程式集 string path = nameSpace + "." + className + "," + assemblyName; //加載型別 Type type = Type.GetType(path); //根據型別創建實體 object obj = Activator.CreateInstance(type, true); //型別轉換并回傳 return (T)obj; } catch { //發生例外時,回傳型別的默認值, return default(T); } } #endregion #region 呼叫方法實體 /// <summary> /// 呼叫方法實體 /// </summary> /// <typeparam name="T">物件型別</typeparam> /// <param name="assemblyName">程式集名稱</param> /// <param name="nameSpace">命名空間</param> /// <param name="className">類名</param> /// <returns></returns> public static T GetInvokeMethod<T>(string assemblyName, string nameSpace, string className, string methodName, object[] paras) { try { //命名空間.類名,程式集 string path = nameSpace + "." + className + "," + assemblyName; //加載型別 Type type = Type.GetType(path); //根據型別創建實體 object obj = Activator.CreateInstance(type, true); //加載方法引數型別及方法 MethodInfo method = null; if (paras != null && paras.Length > 0) { //加載方法引數型別 Type[] paratypes = new Type[paras.Length]; for (int i = 0; i < paras.Length; i++) { paratypes[i] = paras[i].GetType(); } //加載有參方法 method = type.GetMethod(methodName, paratypes); } else { //加載無參方法 method = type.GetMethod(methodName); } //型別轉換并回傳 return (T)method.Invoke(obj, paras); } catch { //發生例外時,回傳型別的默認值, return default(T); } } #endregion
2、新建一個WinForm表單,命名為Main,添加兩個按鈕,

3、新建一個WinForm表單,命名為Form2,

4、Form2表單的代碼如下:
public string SayHello() { return "Hello World."; }
5、Main表單的代碼如下:
/// <summary> /// 呼叫表單2 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { Form form2 = ReflectionHelper.CreateInstance<Form>("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2"); form2.ShowDialog(); } /// <summary> /// 呼叫表單2的SayHello方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { string result = ReflectionHelper.GetInvokeMethod<String>("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2", "SayHello", null); MessageBox.Show(result, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/103508.html
標籤:C#
上一篇:c#圖片相關常用的方法及處理
下一篇:進度條的一種實作想法
