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}\ngetmethod: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
应用示例
CMission { void DoMission(CMissionInfo missionInfo) { var template = missionInfo.Template; 找到本類中的方法 var method = typeof (CMission).getmethod( string.Format(Do{0}stem.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public |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(); } }版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。