C#如何通過反射調用類下的方法


首先模擬一個mvc的項目,創建一個業務類(HomeService),在類下創建3個方法

 public class HomeService
    {
        /// <summary>
        /// 無參方法
        /// </summary>
        /// <returns></returns>
        public string SayHello() {
            string str = "你好!";
            return str;
        }

        /// <summary>
        /// 有參方法(1個)
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string SayHello(string name)
        {
            string str = "你好," + name + "!";
            return str;
        }

        /// <summary>
        /// 有參方法(2個)
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string SayHello(string name,int age)
        {
            string str = "你好," + name + ",你已經"+ age +"歲!";
            return str;
        }
    }

1、正常方式調用類的方法

/// <summary>
        /// 正常調用類的方法(parm1)
        /// </summary>
        /// <returns></returns>
        public string GetNormalMethod_2()
        {
            HomeService service = new HomeService();         
            //調用有參方法(name)
            string result = service.SayHello("李天");
            //輸出調用信息
            string strs = GetInvokeInfo("SayHello(string name)", result);
            return strs;
        }

2、反射方式調用類的方法

/// <summary>
        /// 通過反射調用類的方法(SayHello(string name))
        /// </summary>
        public string GetInvokeMethod_2()
        {
            // 1.Load(命名空間名稱),GetType(命名空間.類名)
            Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
            //2.GetMethod(需要調用的方法名稱)
            MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(string) });
            // 3.調用的實例化方法(非靜態方法)需要創建類型的一個實例
            object obj = Activator.CreateInstance(type);
            //4.方法需要傳入的參數
            object[] parameters = new object[] { "李天"};
            // 5.調用方法,如果調用的是一個靜態方法,就不需要第3步(創建類型的實例)
            // 相應地調用靜態方法時,Invoke的第一個參數為null
            string result = (string)method.Invoke(obj, parameters);

            //輸出調用信息
            string strs = GetInvokeInfo("SayHello(string name)", result);
            return strs;
        }
    

3、調用代碼

 public ActionResult Index()
        {
            /***** 通過正常調用類的方法 *****/

            //1)通過正常調用方法(無參)
            string arg1 = GetNormalMethod_1();
            //2)通過正常調用方法(參1)
            string arg2 = GetNormalMethod_2();
            //3)通過正常調用方法(參1,參2)
            string arg3 = GetNormalMethod_3();

         
            /*****通過反射調用類的方法*****/

            //1)通過反射調用方法(無參)
            string str1 = GetInvokeMethod_1();
            //2)通過反射調用方法(參1)
            string str2 = GetInvokeMethod_2();
            //2)通過反射調用方法(參1,參2)
            string str3 = GetInvokeMethod_3();

            return View();
        }

4、調用結果

5、全部代碼

1)Service類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace StudyInvokeMethod
{
    public class HomeService
    {
        /// <summary>
        /// 無參方法
        /// </summary>
        /// <returns></returns>
        public string SayHello() {
            string str = "你好!";
            return str;
        }

        /// <summary>
        /// 有參方法(1個)
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string SayHello(string name)
        {
            string str = "你好," + name + "!";
            return str;
        }

        /// <summary>
        /// 有參方法(2個)
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string SayHello(string name,int age)
        {
            string str = "你好," + name + ",你已經"+ age +"歲!";
            return str;
        }
    }
}

2)控制器調用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;

namespace StudyInvokeMethod.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            /***** 通過正常調用類的方法 *****/

            //1)通過正常調用方法(無參)
            string arg1 = GetNormalMethod_1();
            //2)通過正常調用方法(參1)
            string arg2 = GetNormalMethod_2();
            //3)通過正常調用方法(參1,參2)
            string arg3 = GetNormalMethod_3();

         
            /*****通過反射調用類的方法*****/

            //1)通過反射調用方法(無參)
            string str1 = GetInvokeMethod_1();
            //2)通過反射調用方法(參1)
            string str2 = GetInvokeMethod_2();
            //2)通過反射調用方法(參1,參2)
            string str3 = GetInvokeMethod_3();

            return View();
        }


        /// <summary>
        /// 正常調用類的方法
        /// </summary>
        /// <returns></returns>
        public string GetNormalMethod_1() {
            HomeService service = new HomeService();
            //調用無參方法
            string result = service.SayHello();
            //輸出調用信息
            string strs = GetInvokeInfo("SayHello()", result);
            return strs;
        }

        /// <summary>
        /// 正常調用類的方法(parm1)
        /// </summary>
        /// <returns></returns>
        public string GetNormalMethod_2()
        {
            HomeService service = new HomeService();         
            //調用有參方法(name)
            string result = service.SayHello("李天");
            //輸出調用信息
            string strs = GetInvokeInfo("SayHello(string name)", result);
            return strs;
        }

        /// <summary>
        /// 正常調用類的方法(parm1,parm2)
        /// </summary>
        /// <returns></returns>
        public string GetNormalMethod_3()
        {
            HomeService service = new HomeService();
            //調用有參方法(name,age)
            string result = service.SayHello("李天", 20);
            //輸出調用信息
            string strs = GetInvokeInfo("SayHello(string name,int age)", result);
            return strs;
        }

        /// <summary>
        /// 通過反射調用類的方法(SayHello())
        /// </summary>
        public string GetInvokeMethod_1() {

            // 1.Load(命名空間名稱),GetType(命名空間.類名)
            Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
            //2.GetMethod(需要調用的方法名稱)
            MethodInfo method = type.GetMethod("SayHello", new Type[] { });
            // 3.調用的實例化方法(非靜態方法)需要創建類型的一個實例
            object obj = Activator.CreateInstance(type);          
            //4.方法需要傳入的參數
            object[] parameters = new object[] { };
            // 5.調用方法,如果調用的是一個靜態方法,就不需要第3步(創建類型的實例)
            // 相應地調用靜態方法時,Invoke的第一個參數為null
            string result = (string)method.Invoke(obj, parameters);

            //輸出調用信息
            string strs = GetInvokeInfo("SayHello()", result); 
            return strs;        
        }

        /// <summary>
        /// 通過反射調用類的方法(SayHello(string name))
        /// </summary>
        public string GetInvokeMethod_2()
        {
            // 1.Load(命名空間名稱),GetType(命名空間.類名)
            Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
            //2.GetMethod(需要調用的方法名稱)
            MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(string) });
            // 3.調用的實例化方法(非靜態方法)需要創建類型的一個實例
            object obj = Activator.CreateInstance(type);
            //4.方法需要傳入的參數
            object[] parameters = new object[] { "李天"};
            // 5.調用方法,如果調用的是一個靜態方法,就不需要第3步(創建類型的實例)
            // 相應地調用靜態方法時,Invoke的第一個參數為null
            string result = (string)method.Invoke(obj, parameters);

            //輸出調用信息
            string strs = GetInvokeInfo("SayHello(string name)", result);
            return strs;
        }

        /// <summary>
        /// 通過反射調用類的方法(SayHello(string name,int age))
        /// </summary>
        public string GetInvokeMethod_3()
        {
            // 1.Load(命名空間名稱),GetType(命名空間.類名)
            Type type = Assembly.Load("StudyInvokeMethod").GetType("StudyInvokeMethod.HomeService");
            //2.GetMethod(需要調用的方法名稱)
            MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(string),typeof(int) });
            // 3.調用的實例化方法(非靜態方法)需要創建類型的一個實例
            object obj = Activator.CreateInstance(type);
            //4.方法需要傳入的參數
            object[] parameters = new object[] { "李天",18};
            // 5.調用方法,如果調用的是一個靜態方法,就不需要第3步(創建類型的實例)
            // 相應地調用靜態方法時,Invoke的第一個參數為null
            string result = (string)method.Invoke(obj, parameters);

            //輸出調用信息
            string strs = GetInvokeInfo("SayHello(string name,int age)", result);
            return strs;
        }

        /// <summary>
        /// 調用方法輸出信息
        /// </summary>
        /// <param name="method">調用方法名</param>
        /// <param name="str">返回信息</param>
        /// <returns></returns>
        public string GetInvokeInfo(string method, string str)
        {
            string result = string.Format("調用方法:{0},輸出:{1}", method, str);
            return result;
        }
    }
}

PS:

參考網址:https://blog.csdn.net/likekobe2012/article/details/41824285

 


免責聲明!

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



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