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

转载自:https://www.cnblogs.com/coderJiebao/p/CSharp09.html

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

using System;
using System.Reflection;

class Test
{
    // 无参数,无返回值方法
    public void Method()
    {
        Console.WriteLine("Method(无参数) 调用成功!");
    }

    // 有参数,无返回值方法
    public void Method(string str)
    {
        Console.WriteLine("Method(有参数) 调用成功!参数 :" + str);
    }

    // 有参数,有返回值方法
    public string Method(string str1, string str2)
    {
        Console.WriteLine("Method(有参数,有返回值) 调用成功!参数 :" + str1 + ", " + str2);
        string className = this.GetType().FullName;         // 非静态方法获取类名
        return className;
    }
}

class Program
{
    static void Main(string[] args)
    {
        string strClass = "Test";           // 命名空间+类名
        string strMethod = "Method";        // 方法名

        Type type;                          // 存储类
        Object obj;                         // 存储类的实例

        type = Type.GetType(strClass);      // 通过类名获取同名类
        obj = System.Activator.CreateInstance(type);       // 创建实例

        MethodInfo method = type.GetMethod(strMethod, new Type[] {});      // 获取方法信息
        object[] parameters = null;
        method.Invoke(obj, parameters);                           // 调用方法,参数为空

        // 注意获取重载方法,需要指定参数类型
        method = type.GetMethod(strMethod, new Type[] { typeof(string) });      // 获取方法信息
        parameters = new object[] {"hello"};
        method.Invoke(obj, parameters);                             // 调用方法,有参数

        method = type.GetMethod(strMethod, new Type[] { typeof(string), typeof(string) });      // 获取方法信息
        parameters = new object[] { "hello", "你好" };
        string result = (string)method.Invoke(obj, parameters);     // 调用方法,有参数,有返回值
        Console.WriteLine("Method 返回值:" + result);                // 输出返回值

        // 获取静态方法类名
        string className = MethodBase.GetCurrentMethod().ReflectedType.FullName;
        Console.WriteLine("当前静态方法类名:" + className);

        Console.ReadKey();
    }
}

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

另外补充:方法必须是public否则找不到,为null。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值