反射的性能:
使用反射来调用类型或者触发方法,或者访问一个字段或者属性时clr 需 要做更多的工作:校验参数,检查权限等等,所以速度是非常慢的。所以尽量不要使用反射进行编程,对于打算编写一个动态构造类型(晚绑定)的应用程序,可以采取以下的几种方式进行代替:
1. 通过类的继承关系。让该类型从一个编译时可知的基础类型派生出来,在运行时生成该类 型的一个实例,将对其的引用放到其基础类型的一个变量中,然后调用该基础类型的虚方法。
2. 通过接口实现。在运行时,构建该类型的一个实例,将对其的引用放到其接口类型的一个变量中,然后调用该接口定义的虚方法。
3.通过委托实现。让该类型实现一个方法,其名称和原型都与一个在编译时就已知的委托相符。在运行时先构造该类型的实例,然后在用该方法的对象及名称构造出该委托的实例,接着通过委托调用你想要的方法。这个方法相对与前面两个方法所作的工作要多一些,效率更低一些
http://blog.csdn.net/21aspnet/archive/2007/03/24/1539865.aspx
Code
class Program
{
static void Main(string[] args)
{
TestClass tc = new TestClass();
MethodInfo mi = tc.GetType().GetMethod("Method2");
object[] arrO = new object[1];
arrO[0] = "1";
//两种动态调用方法的方法,方法没有参数是arrO换成null
mi.Invoke(tc, arrO);
tc.GetType().InvokeMember("Method2", BindingFlags.InvokeMethod, null, tc, arrO);
//动态调用构造函数创建类的实例也类似Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
TestClass tc2 = (TestClass)Assembly.Load("反射").CreateInstance("反射.TestClass");
MemberInfo[] arrMI = tc.GetType().GetMembers();
foreach (MemberInfo miTest in arrMI)
{
Console.WriteLine(miTest.Name);
}
Console.Read();
}
}
class TestClass
{
public TestClass()
{
Console.WriteLine("Method1");
}
public void Method2(string str)
{
Console.WriteLine("Method2" + str);
}
}