• C# Reflection Type/MethodInfo


    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("******直接调用方法******
     {0} 
    ", result1);
                
                //方法二
                MethodInfo method = class1Type.GetMethod("AddNum", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                int result2 = (int)method.Invoke(obj, mParam);
                Console.WriteLine("*******使用MethodInfo*********
     {0}
    ", result2);
     
                //方法三:本类的方法 修饰符为static
                MethodInfo method1 = Type.GetType("MyReflection.Demo1").GetMethod("Mult");//这里需要加上NameSpace
                int mult = (int)method1.Invoke(null, mParam);
                Console.WriteLine("*****本类中的方法*****  
    {0}
    ",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();
        }
    }
  • 相关阅读:
    在网页上下载文件
    sql server 分离附加
    在vue中,ref属性与$refs对象的区别
    在ES6中,export default 和 export的区别
    element-ui之Table表格el-table标签
    element-ui之Form表单el-form标签
    使用Mybatis-Generator自动生成Dao,Entity,Mapping
    linux下普通用户与root的切换
    idea插件将下划线转驼峰形式
    利用wsdl2java工具生成webservice的客户端代码
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/3944497.html
Copyright © 2020-2023  润新知