加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

C# Reflection Type/MethodInfo

发布时间:2021-05-21 06:59:37 所属栏目:大数据 来源: https://www.jb51.cc
导读:C#反射 在C#的反射中,可以通过Type来执行类中的某个方法,也可以通过MethodInfo来执行方法 三种调用方法 下面的示例中使用了三种方法来执行方法 两个类:Class1和Demo1,通过反射执行Class1中的AddNum()方法和 反射执行Demo1中的Mult()方法 using System; S

C#反射

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

三种调用方法

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

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

using System;
 System.Reflection;
 
namespace MyReflection
{
    public class Class1
    {
        //将要反射的方法
        int AddNum(int numb1,int numb2)
        {
            int sum = numb1 + numb2;
            return sum;
        }
    }
 
 
     Demo1
    {
        static int Mult(return numb1 * numb2;
        }
 
        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,1)">null,obj,mParam);
            Console.Write(******直接调用方法******n {0} n"方法二
            MethodInfo method = class1Type.GetMethod( BindingFlags.IgnoreCase);
            int result2 = ()method.Invoke(obj,mParam);
            Console.WriteLine(*******使用MethodInfo*********n {0}n方法三:本类的方法 修饰符为static
            MethodInfo method1 = Type.GetType(MyReflection.Demo1").GetMethod(Mult");这里需要加上NameSpace
            int mult = (int)method1.Invoke(*****本类中的方法*****  n{0}nMethodInfo 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

应用示例

 CMission
{
    void DoMission(CMissionInfo missionInfo)
    {
        var template = missionInfo.Template;
        找到本類中的方法
        var method = typeof (CMission).GetMethod( string.Format(Do{0}System.Reflection.BindingFlags.NonPublic);
        
        if (method == )
        {
            CDebug.LogError(未处理的Mission行为:{0}-{1},Mission:{2};    
        }
        
        執行方法,传参数
        method.Invoke(null,1)">object[] {missionInfo.TemplateArgs});

    }

    void DoLevel( args)
    {
        if (CTool.IsNumber(args))
        {
          CUILevelList.DoLevelById(args.ToInt32());
        }
        else
            CDebug.LogError(请检查,任务进入关卡Id {0} 不是数字挑战普通关[主线]
    void DoNormalLevel( args)
    {
        CUIChapterList.ShowNormal();
    }
}

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读