C# 反射,通过类名、方法名调用方法

  在 C# 代码中,有些时候只知道方法的名字(string),需要调用该方法,那么就需要用到 C# 的反射机制。下面是一个简单的 demo。

 1 using System;
 2 using System.Reflection;
 3
 4 class Test
 5 {
 6     // 无参数,无返回值方法
 7     public void Method()
 8     {
 9         Console.WriteLine("Method(无参数) 调用成功!");
10     }
11
12     // 有参数,无返回值方法
13     public void Method(string str)
14     {
15         Console.WriteLine("Method(有参数) 调用成功!参数 :" + str);
16     }
17
18     // 有参数,有返回值方法
19     public string Method(string str1, string str2)
20     {
21         Console.WriteLine("Method(有参数,有返回值) 调用成功!参数 :" + str1 + ", " + str2);
22         string className = this.GetType().FullName;         // 非静态方法获取类名
23         return className;
24     }
25 }
26
27 class Program
28 {
29     static void Main(string[] args)
30     {
31         string strClass = "Test";           // 命名空间+类名
32         string strMethod = "Method";        // 方法名
33
34         Type type;                          // 存储类
35         Object obj;                         // 存储类的实例
36
37         type = Type.GetType(strClass);      // 通过类名获取同名类
38         obj = System.Activator.CreateInstance(type);       // 创建实例
39
40         MethodInfo method = type.GetMethod(strMethod, new Type[] {});      // 获取方法信息
41         object[] parameters = null;
42         method.Invoke(obj, parameters);                           // 调用方法,参数为空
43
44         // 注意获取重载方法,需要指定参数类型
45         method = type.GetMethod(strMethod, new Type[] { typeof(string) });      // 获取方法信息
46         parameters = new object[] {"hello"};
47         method.Invoke(obj, parameters);                             // 调用方法,有参数
48
49         method = type.GetMethod(strMethod, new Type[] { typeof(string), typeof(string) });      // 获取方法信息
50         parameters = new object[] { "hello", "你好" };
51         string result = (string)method.Invoke(obj, parameters);     // 调用方法,有参数,有返回值
52         Console.WriteLine("Method 返回值:" + result);                // 输出返回值
53
54         // 获取静态方法类名
55         string className = MethodBase.GetCurrentMethod().ReflectedType.FullName;
56         Console.WriteLine("当前静态方法类名:" + className);
57
58         Console.ReadKey();
59     }
60 }

  需要注意的是,类名是命名空间+类名,不然会找不到类。

原文地址:https://www.cnblogs.com/coderJiebao/p/CSharp09.html

时间: 2024-10-04 01:05:01

C# 反射,通过类名、方法名调用方法的相关文章

java反射机制——字符串拼接方法名调用方法

1 public class Person { 2 public String getPerson1(String i){ 3 return "Person1--"+i; 4 5 } 6 public String getPerson2(String i){ 7 return "Person2--"+i; 8 9 } 10 public String getPerson3(String i){ 11 return "Person3--"+i; 1

C#如何通过反射调用类下的方法

首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 /// </summary> /// <returns></returns> public string SayHello() { string str = "你好!"; return str; } /// <summary> /// 有参方

laravel 中使用反射得到类的所有方法

以Carbon这个时间处理库为例 $class = new \ReflectionClass('Carbon\Carbon');//获取反射类 $methods = $class->getMethods();//获取反射类的所有的方法 //各个方法的处理效果 foreach ($methods as $key => $value) { $hasMethod[] = $value->name; if (ends_with($value->name, 'String') &&a

java通过反射获取调用变量以及方法

一:反射概念 可以通过Class类获取某个类的成员变量以及方法,并且调用之. 二:通过反射获取方法.变量.构造方法 1 @Test 2 // 通过反射获取类定义的方法 3 public void testMethod() throws Exception { 4 @SuppressWarnings("rawtypes") 5 Class clazz = Class.forName("java.lang.String"); 6 Method[] m = clazz.g

C#反射调用程序集类中方法

建立类 class OperatorClass { /// <summary> /// 加法 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> /// public static int Add(int x, int y) { r

javascript 字符串方法名调用

项目中有时候需要通过字符串传递方法名称,供页面调用 var ParameterDefaultCallMethod = Request("ParameterDefaultCallMethod"); //默认调用方法 if (ParameterDefaultCallMethod != null && ParameterDefaultCallMethod != "") { eval('window.parent.' + ParameterDefaultCa

java反射调用某个对象的方法

// 反射调用某个对象的方法 public Object invokeMethod(Object methodObject, String methodName, Object[] args) throws Exception { Class ownerClass = methodObject.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) {

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

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

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

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