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
平时多记记,到用时才能看看,记录你的进步,分享你的成果