C#通过反射调用类及方法
程序员文章站
2023-04-04 16:38:59
反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类)。下面演示一下通过反射调用类及方法: 1、新建一个类,命名为:ReflectionHelper,代码如下: #region 创建对象实例 /// /// 创建对象实例 /// /// ......
反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类)。下面演示一下通过反射调用类及方法:
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); }