C# Reflection Type/MethodInfo

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/3944497.html



C#反射#

在C#的反射中,可以通过Type来执行类中的某个方法,也可以通过MethodInfo来执行方法

三种调用方法#

下面的示例中使用了三种方法来执行方法

两个类:Class1和Demo1,通过反射执行Class1中的AddNum()方法和 反射执行Demo1中的Mult()方法

复制代码
using System;
using System.Reflection;
 
namespace MyReflection
{
    public class Class1
    {
        //将要反射的方法
        public int AddNum(int numb1, int numb2)
        {
            int sum = numb1 + numb2;
            return sum;
        }
    }
 
 
    public class Demo1
    {
        public static int Mult(int numb1, int numb2)
        {
            return numb1 * numb2;
        }
 
        static void Main(string[] args)
        {
            //获取Class1的Type
            Type class1Type = typeof(Class1);
            //本地或远程创建对象的实例
            object obj = Activator.CreateInstance(class1Type);
            object[] mParam = new object[] { 5, 10 };//构造一个object数组作为参数
 
            //方法一:调用(invoke) 方法(AddNum),并传递参数
            int result1 = (int)class1Type.InvokeMember("AddNum", BindingFlags.InvokeMethod,null, obj, mParam);
            Console.Write("******直接调用方法******\n {0} \n", result1);
            
            //方法二
            MethodInfo method = class1Type.GetMethod("AddNum", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
            int result2 = (int)method.Invoke(obj, mParam);
            Console.WriteLine("*******使用MethodInfo*********\n {0}\n", result2);
 
            //方法三:本类的方法 修饰符为static
            MethodInfo method1 = Type.GetType("MyReflection.Demo1").GetMethod("Mult");//这里需要加上NameSpace
            int mult = (int)method1.Invoke(null, mParam);
            Console.WriteLine("*****本类中的方法*****  \n{0}\n",mult);
        }
    }
}
复制代码

示例解释#

GetMethod:Type类有个GetMethod方法,调用该方法可以获取指定方法名的方法信息实例。

使用时,其参数一般为2个,一个是方法名称字符串(可设置条件忽略大小写),另外一个参数为搜索方法的条件枚举。

该方法返回的是MethodInfo类型的实例,获取到了这个实例之后,我们就可以调用并执行该方法了。

MethodInfo method = type.GetMethod( funcName , BindingFlags.IgnoreCase | BindingFlags.Static | BindingFlags.Public );

这里要注意,搜索条件枚举,即第2个参数,要包含BindingFlags.Public,否则会返回NULL的。

如果是静态的方法,还要设置一个条件BindingFlags.Static。

得到了MethodInfo实例后,反射执行该方法:

method.Invoke( obj, arrParam );

obj为调用方法所属的类型实例,如果调用的为静态方法,可设置为null;arrParam为方法参数数组。

实际应用#

任务系统:任务系统,程序制作好功能单元,策划填表进行不同的任务,每一条任务的Type,Arg供程序使用。

思路:把功能单元写好,执行本类的Method

应用示例#

复制代码
public class CMission
{
    public static void DoMission(CMissionInfo missionInfo)
    {
        var template = missionInfo.Template;
        //找到本類中的方法
        var method = typeof (CMission).GetMethod( string.Format("Do{0}", template),
        System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.NonPublic);
        
        if (method == null)
        {
            CDebug.LogError("未处理的Mission行为:{0}-{1} ,Mission:{2}",missionInfo.Id,missionInfo.Name, missionInfo.Template);
            return;    
        }
        
        //執行方法,传参数
        method.Invoke(null, new object[] {missionInfo.TemplateArgs});

    }

    static void DoLevel(string args)
    {
        if (CTool.IsNumber(args))
        {
          CUILevelList.DoLevelById(args.ToInt32());
        }
        else
            CDebug.LogError("请检查,任务进入关卡Id {0} 不是数字",args);
    }

    //挑战普通关[主线]
    static void DoNormalLevel(string args)
    {
        CUIChapterList.ShowNormal();
    }
}
复制代码
作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(4113)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示
CONTENTS