反射时,由于编译器要判断权限,身份等操作,所以比直接操作要慢
测试代码:
const int NUM = 1000000; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < NUM; i++) { ReflectTest rt = new ReflectTest(); rt.CountSomething(); } sw.Stop(); Console.WriteLine(sw.ElapsedTicks); sw.Reset(); sw.Start(); for (int i = 0; i < NUM; i++) { Assembly assembly = Assembly.GetExecutingAssembly(); Type t = assembly.GetType("ConsoleApplication1.ReflectTest"); ConstructorInfo constructorInfo = t.GetConstructors().OrderBy(c => c.GetParameters().Length).FirstOrDefault(); object obj = constructorInfo.Invoke(new object[constructorInfo.GetParameters().Length]); //object obj = Activator.CreateInstance(t); MethodInfo methodInfo = t.GetMethod("CountSomething"); methodInfo.Invoke(obj,new object[methodInfo.GetParameters().Length]); } sw.Stop(); Console.WriteLine(sw.ElapsedTicks); Console.ReadKey();
结果:
反射用时是直接调用的2到3倍,所以非特殊需求,项目中就不要用反射吧。。。