反射基础知识介绍

时间:2010-02-06 12:29:08  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:.CreateInstance<T>(args)).Equals(instance);   }   编译会提示出错,原因就在于Activator.CreateInstance<T>无法指定参数类型来创建实例。 有可能是因为我想通过泛型的方式,在调用同一个方法的实例化指定的带有参数的<T>,保存到HashTable中,也许,无知了些。所以,我必须想办法解决。反射?OK,可行。但是我希望能有更好的方式来代...
  正文:最段不知道什么原因,一直对Activator.CreateInstance<T>() 无法创建指定构造函数的实例而耿耿于怀.举个例子:
  public static bool StrangeEquals<T>(T instance, params object[] args){
   return Activator.CreateInstance<T>(args)).Equals(instance);
  }
  编译会提示出错,原因就在于Activator.CreateInstance<T>无法指定参数类型来创建实例。 有可能是因为我想通过泛型的方式,在调用同一个方法的实例化指定的带有参数的<T>,保存到HashTable中,也许,无知了些。所以,我必须想办法解决。反射?OK,可行。但是我希望能有更好的方式来代替。在网上看到Haibo Luo写的关于反射 的六种方法和性能比较: Activator.CreateInstance and beyond :
  Activator.CreateInstance,
  Reflection.Emit,
  DynamicMethod.Invoke,
  ConstructorInfo.Invoke,
  Reflection.Emit+Delegate,
  DynamicMethod+Delegate,
  我们可以参考上面各种方法在性能上的差别和实现。现在才回来想起来曾经的DynamicMethod,曾经,感觉离我那么远,现在,又离我那么近。在Manuel Abadia的Generic method invocation at runtime without using reflection – DynamicMethods 这篇文章中,详细介绍了DynamicMethod+Delegate使用和对Reflection的性能比较,讲解的很清晰,值的一读。不过。让人遗憾的一点就是,代码中并未提示带参数的实例化(只是默认的实例化)。当然,我们只需要进行简单的修改,就可以实现我们的需求。
  
   1 public delegate object FastCreateInstanceByParametersHander(object[] parameters);
   2 public static FastCreateInstanceByParametersHander GetInstanceCreator(Type type,Type[] parameter)
   3 {
   4 DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, type, parameter,typeof(DynamicCalls).Module);
   5
   6 ILGenerator ilGenerator = dynamicMethod.GetILGenerator();
   7 ilGenerator.Emit(OpCodes.Nop);
   8 ilGenerator.Emit(OpCodes.Ldarg_0);
   9 ilGenerator.Emit(OpCodes.Newobj, type.GetConstructor(parameter));
  10
  11 ilGenerator.Emit(OpCodes.Ret);
  12 // TestShowVisualizer(dynamicMethod);
  13 FastCreateInstanceByParametersHander creator = (FastCreateInstanceByParametersHander)dynamicMethod.CreateDelegate(typeof(FastCreateInstanceByParametersHander));
  14
  15 return creator;
  16 }
  17 测试类
  1 public class TestClass
  2 {
  3 public TestClass(object[] s)
  4 {
  5 // input = s;
  6 }
  7 }
  8 调用
  
  FastCreateInstanceByParametersHander creator1 = DynamicCalls.GetInstanceCreator(typeof(TestClass), new Type[] { typeof(object[]) });
  TestClass p = (TestClass)creator1.Invoke(new object[] { "hello" });
  
  在测试的时候注意到,装箱,拆箱对性能实在太大了。好的建议就是:如果您知道你类的构造函数的参数,请使用使用指定的类型,而不要使用object[],如
   public delegate object FastCreateInstanceByParametersHander(string parameters);
  
  另外,发现一个很有意思的工具:显示DynamicMethod生成的代码。使用介绍:DebuggerVisualizer for DynamicMethod
  
  我们只需要将项目中引用DynamicMethodVisualizer和Microsoft.VisualStudio.DebuggerVisualizers,在代码中添加即可测试,对我们用DynamicMethod生成的IL来说,是非常有帮助的。
  public static void TestShowVisualizer(object objectToVisualize)
   {
   VisualizerDevelopmentHost visualizerHost = new VisualizerDevelopmentHost(objectToVisualize, typeof(DynamicMethodVisualizer.MethodBodyVisualizer), typeof(DynamicMethodVisualizer.MethodBodyObjectSource));
   visualizerHost.ShowVisualizer();

反射基础知识介绍》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/12812.html


关键字:

关于《反射基础知识介绍》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td