Board logo

标题: .net的反射机制(6) [打印本页]

作者: look_w    时间: 2019-4-16 19:17     标题: .net的反射机制(6)

4.反射的性能优化。


我们用2.简单例子中的reflectorDemo()函数来学一下怎么优化。

      public static void reflectorDemo()  
            {
     
     
                Assembly ass;
                Type type;
                MethodInfo method;
               try
                {
                    ass = Assembly.Load("ReflectorTest"); //根据命名空间加载
                    //ass = Assembly.LoadFile("ReflectorTest.DLL");根据文件名称尝试加载
                    type = ass.GetType("ReflectorTest.Test");//根据类型名称,反射出该类型(注意格式是:“命名空间.类名”)
                    object o =Activator.CreateInstance(type);//创建该类型的对象实例
                  
                   method=type.GetMethod("sayHello");//反射获取方法(实例方法)
                   string s = (string)method.Invoke(o,new string[] {"张三"});//调用实例方法
                   MessageBox.Show("调用实例方法返回:" + s);
     
                    method=type.GetMethod("noParm");//无参方法
                    s= (string) method.Invoke(o,null);//调用无参函数
                    MessageBox.Show("调用无参方法返回:" + s);  
     
     
                    //type.GetProperties()//获取该类型下面的所有公共属性            
     
                   method=type.GetMethod("staticMethod");//静态函数
                    s = (string)method.Invoke(null, new string[] { "张三" });//调用静态方法
                   MessageBox.Show("调用静态方法返回:"+s);
     
                   //根据指定的属性名称,获得属性值
                   type.GetProperty("Name").GetValue(o,null);
                    //给属性设值
                    type.GetProperty("Name").SetValue(o, "张三", null);
     
     
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                      ass=null;
                    type=null;
                    method=null;            
                }         
            }


比如:优化调用实例方法:

原反射:

     type = ass.GetType("ReflectorTest.Test");//根据类型名称,反射出该类型(注意格式是:“命名空间.类名”)
                    object o =Activator.CreateInstance(type);//创建该类型的对象实例
                  
                   method=type.GetMethod("sayHello");//反射获取方法(实例方法)
                   string s = (string)method.Invoke(o,new string[] {"张三"});//调用实例方法
                   MessageBox.Show("调用实例方法返回:" + s);


通过委托优化:


   

     public delegate int AddMethod(string a); // 委托
    type = ass.GetType("ReflectorTest.Test");//根据类型名称,反射出该类型(注意格式是:“命名空间.类名”)            
     object o =Activator.CreateInstance(type);//创建该类型的对象实例  
    method=type.GetMethod("sayHello");//反射获取方法(实例方法)
     
      var newMethod = (AddMethod)Delegate.CreateDelegate(typeof(AddMethod), obj, method);
      
    string s = newMethod(new string[] {"张三"});//调用实例方法
             MessageBox.Show("调用实例方法返回:" + s);



上面的代码看起来多了几行,而且还需要自定义一个委托,写起来挺麻烦的。因此我们的测试代码里面还实现了另外一种形式,其实它也是委托:

var newMethod = (Func<TestObject, string>)Delegate.CreateDelegate(typeof(Func<TestObject, string>), method);



通过.NET4动态编程的实现

     dynamic obj = new Test();
     
     // 有木有发现这个代码超级简单? Test对应程序集中的类名。

string s =obj.sayHello(“张三”);

MessageBox.Show("调用实例方法返回:" + s);




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0