C#通過反射調用類及方法


    反射有個典型的應用,就是菜單的動態加載,原理就是通過反射調用某個窗體(類)。下面演示一下通過反射調用類及方法:

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

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM