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

原文地址:https://www.cnblogs.com/xielong/p/9561875.html

时间: 2024-11-06 22:25:45

C#如何通过反射调用类下的方法的相关文章

通过反射 调用 类里面的 方法的方法

通过反射 调用 类里面的 方法的方法(注意 重载 ,可以 按F12转到 定义 查看 ): 错误方法: MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType); dynMethod.Invoke(this, new object[] { methodParams }); 正确 方法 : MethodInfo dynMethod = this.GetType().GetMethod("Draw_&qu

通过反射调用类中的方法

操作步骤: 1:实例化Class: 2:通过Class类的getMethod()方法取得一个Method的对象,并设置次方法操作时所需的参数类型: 3:使用invoke进行调用,并向方法中传递要设置的参数,但在使用invoke()方法时必须传入一个类的实例化对象 实例1:sayChina()方法中没有参数 package cn.itcast02; import java.lang.reflect.Method; //调用Person类中的sayChina()方法,没有参数 public clas

Java_通过反射调用类中的方法

先上一个基本的封装: /** * 获取classType * * @param type * @param provinceCode * @param cityCode * @return * @throws Exception */ public Class<?> getClassType(String type, String provinceCode, String cityCode, String suffix) throws Exception { Class<?> cl

C#反射调用类的私有方法

void Main() { var type = typeof(StockClass); type.Dump(); var fields=type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic).Dump("字段"); var members = type.GetMethods().Dump("方法"); //调用私有的构造函数,获得实例化对象 object obj=type.GetConstructo

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

Java反射调用多种类型的方法总结

最近一直在搞Java中的反射,遇到了小问题,所以总结下反射时调用方法需要注意的事项以及各种例子. 本例主要实现的功能有 * 1.没有参数的方法 * 2.一个参数的方法,没有返回值的方法 * 3.多个参数的方法 * 4.参数为数组的方法 * 5.参数为集合的方法 * 6.返回值为数组的方法 下面直接来例子 package com.mine.practice.reflectMethod; import java.lang.reflect.InvocationTargetException; impo

根据类名,方法名,反射调用类的方法

/** * 根据类名,方法名,反射调用类的方法 * @方法名称: getResult * @描述: TODO * @param className * @param methodName * @param params * @return */ public static String getResult(String className,String methodName,Map<String,Object> params){ String result = null; try{ Objec

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

反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创建对象实例 /// <summary> /// 创建对象实例 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="assemblyN

Java 反射调用私有域和方法(setAccessible)

Java 反射调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了AccessibleObject类,该基类有两个setAccessible方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法.域和构造方法 public class AccessibleObjectextends