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); |