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("李天", );
//输出调用信息
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[] { "李天",};
// 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
C#如何通过反射调用类下的方法的更多相关文章
- C# 利用反射调用类下的方法
namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- Java_通过反射调用类中的方法
先上一个基本的封装: /** * 获取classType * * @param type * @param provinceCode * @param cityCode * @return * @th ...
- C#反射调用类的私有方法
void Main() { var type = typeof(StockClass); type.Dump(); var fields=type.GetFields(BindingFlags.Ins ...
- Java中的静态方法和实例方法的调用的理解(不同的类下的方法调用)
public class MethodCall { public static void main(String[] args) { Test.sayStatic(); Test test = new ...
- C#通过反射调用类及方法
反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创 ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- [ 转载 ] Java基础10--关于Object类下所有方法的简单解析
关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...
随机推荐
- 9. spring项目中web.xml详解解读
引言:本篇博客的内容大部分都来自网上,有的是直接copy,有的是自己整理而来.既然网上已经有了,为啥还有自己copy呢? 感觉是因为网上的东西太散了或者是样式不够美观,所以自己又copy了一遍.如有侵 ...
- Mysql 强行Kill 连接
BEGIN ; ; ; DO KILL @Temp; ; END WHILE ; END
- JAVA创建子进程并处理waitFor() 阻塞问题
虽然很想休息,但是想想还是要把今天学的东西记下来,不然以后再用还是新知识. 新建一个线程类读取子进程的汇报信息和错误信息,避免阻塞 class StreamGobbler extends Thread ...
- Qt访问注册表并调用子进程
在实际应用中需要在一个进程启动另外一个进程,可以将子进程的路径写入注册表中,然后主进程读取注册表中子进程路径,启动子进程,并以命令行参数的形式传入参数,启动子进程.具体实现方式如下 (1) ...
- TortoiseSVN上传cocos2dx的项目不能打包的问题!
由于TortoiseSVN默认是忽略 *.a的,导致上传的项目文件缺少所有的*.a文件. 在TortoiseSVN->Settings->General->Global ignore ...
- Codeforces 960D - Full Binary Tree Queries
960D - Full Binary Tree Queries 思路: 用move1[i]记录第i层第1种操作移动的个数(对这一层的个数取模) 用move2[i]记录第i层第2种操作移动的个数(对这一 ...
- mui体验理解
1. mui简介 1.1 缘起 1.基于jq的jqmobile,性能低的无法忍受,且UI难看 2.bootstrap这种响应式设计,性能在低端机不足,而且UI风格一看就是网页,不是App的 ...
- 到达一个数 Reach a Number
2018-09-24 14:19:58 问题描述: 问题求解: 初看到这个问题,直觉上认为可以通过BFS遍历解空间进行求解,因为本质上来说,这个问题和棋盘上移动马的问题是一类问题,都是可以转化成图的问 ...
- 雷林鹏分享:C# 判断
C# 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C ...
- 批量显示QC结果的利器(转)
作者:greenhillman MultiQC homepage: http://multiqc.info功能:把多个测序结果的qc结果整合成一个报告.支持fastqc.trimmomatic.bow ...