Reflection需要加载大量的类型元数据然后进行处理.这可能导致更大的内存开销和更慢的执行.根据这篇文章,属性修改慢约2.5x-3x,方法调用慢3.5x-4x.
这是一篇优秀的MSDN文章,概述了如何更快地进行反射以及开销在哪里.如果您想了解更多信息,我强烈建议您阅读.
还有一个复杂因素,反射可以添加到代码中,使其更加混乱,因此难以使用.像Scott Hanselman这样的人认为,通过使用反射,你经常会遇到比你解决的问题更多的问题.如果您的团队主要是初级开发人员,情况尤其如此.
如果您需要很多动态行为,最好还是研究DLR(动态语言运行时).随着.NET 4.0中的新变化,您可能希望了解是否可以将其中的一部分合并到您的解决方案中.VB和C#增加了对动态的支持,使得动态代码非常优雅,并且可以非常直接地创建自己的动态对象.
祝好运.
编辑:我在斯科特的网站上做了一些更多的探索,发现这个播客反思.我没有听过,但它可能值得.
Reflection需要加载大量的类型元数据然后进行处理.这可能导致更大的内存开销和更慢的执行.根据这篇文章,属性修改慢约2.5x-3x,方法调用慢3.5x-4x.
这是一篇优秀的MSDN文章,概述了如何更快地进行反射以及开销在哪里.如果您想了解更多信息,我强烈建议您阅读.
还有一个复杂因素,反射可以添加到代码中,使其更加混乱,因此难以使用.像Scott Hanselman这样的人认为,通过使用反射,你经常会遇到比你解决的问题更多的问题.如果您的团队主要是初级开发人员,情况尤其如此.
如果您需要很多动态行为,最好还是研究DLR(动态语言运行时).随着.NET 4.0中的新变化,您可能希望了解是否可以将其中的一部分合并到您的解决方案中.VB和C#增加了对动态的支持,使得动态代码非常优雅,并且可以非常直接地创建自己的动态对象.
祝好运.
编辑:我在斯科特的网站上做了一些更多的探索,发现这个播客反思.我没有听过,但它可能值得.
你可以做很多事情来加速反思.例如,如果您正在进行大量的属性访问,那么HyperDescriptor可能会很有用.
如果您正在进行大量的方法调用,那么您可以使用方法将方法缓存到类型化的委托Delegate.CreateDelegate
- 然后只进行一次类型检查等(期间CreateDelegate
).
如果你正在做很多对象构造,那么Delegate.CreateDelegate
就无济于事了(你不能在构造函数上使用它) - 但是(在3.5中)Expression
可以用来做这个,再次编译成一个类型化的委托.
所以是的:反射很慢,但你可以在没有太多痛苦的情况下进行优化.