反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类)。下面演示一下通过反射调用类及方法:
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] { 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); }
联系客服