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

2021-01-28 18:15

阅读:789

标签:end   加载类   img   添加   http   sage   异常   i++   参数   

    反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类)。下面演示一下通过反射调用类及方法:

    1、新建一个类,命名为:ReflectionHelper,代码如下:

        #region 创建对象实例

        /// 
        /// 创建对象实例
        /// 
        /// 对象类型
        /// 程序集名称
        /// 命名空间
        /// 类名
        /// 
        public static T CreateInstance(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 调用方法实例

        /// 
        /// 调用方法实例
        /// 
        /// 对象类型
        /// 程序集名称
        /// 命名空间
        /// 类名
        /// 
        public static T GetInvokeMethod(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 )
                    {
                        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窗体的代码如下:

        /// 
        /// 调用窗体2
        /// 
        /// 
        /// 
        private void button1_Click(object sender, EventArgs e)
        {
            Form form2 = ReflectionHelper.CreateInstance
("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2"); form2.ShowDialog(); } /// /// 调用窗体2的SayHello方法 /// /// /// private void button2_Click(object sender, EventArgs e) { string result = ReflectionHelper.GetInvokeMethod("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2", "SayHello", null); MessageBox.Show(result, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }

   

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

标签:end   加载类   img   添加   http   sage   异常   i++   参数   

原文地址:https://www.cnblogs.com/atomy/p/11880416.html


评论


亲,登录后才可以留言!