欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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,添加两个按钮。

 C#通过反射调用类及方法

    3、新建一个winform窗体,命名为form2。

C#通过反射调用类及方法

    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);
        }