static void Main()
{
DynamicObj obj = new DynamicObj();
var fun = obj.GetType().GetMethod(nameof(obj.CallFun));
Int32 result = (Int32)fun.Invoke(obj, new Object[] { "Fode" });
Console.WriteLine(result);
Console.ReadKey();
}
public class DynamicObj
{
public Int32 CallFun(String str)
{
return str.Length;
}
}
其结果没有什么好讲的,就是一个用反射调用 CallFun() 方法的例子,而用dynamic之后,代码看上去更简洁了,并且在可控制的范围内减少了一次拆箱的操作,
dynamic dyn = new DynamicObj();
Int32 result = dyn.CallFun("Fode");
Console.WriteLine(result);
可能我们会对这样的简化不以为然,毕竟代码看起来并没有减少多少,但是,如果考虑到效率兼优美两个特性,那么dynamic的优势就显现出来了。对上面的代码个执行10000000次,在进行分析,如下所示:
CodeTimer.Time("使用dynamic", 10000000, () => { //执行里面的代码10000000次
dynamic dyn = new DynamicObj();
Int32 result = dyn.CallFun("Fode");
});
CodeTimer.Time("使用基础反射", 10000000, () => { //执行里面的代码10000000次
DynamicObj obj = new DynamicObj();
var fun = obj.GetType().GetMethod(nameof(obj.CallFun));
Int32 result = (Int32)fun.Invoke(obj, new Object[] { "Fode" });
});
Console.ReadKey();
其运行结果如下所示:
从以上结果看出,使用dynamic使用时间为481ms,基础反射使用时间为3063ms,CPU和时间上相差了5倍多,测试器 CodeTimer 的代码随后会贴出。
总结:
可以看到虽然用dynamic优化后的反射跟基础反射的相比,效率虽然在同一个数量级上。可是基础反射却没有dynamic代码简洁,因此建议:始终使用dynamic来简化反射实现(前提你知道你要是实现的类型),在往后的随笔,将会提出用ExpressionTree和Emit技术深度优化反射。











