2011-08-26 41 views

回答

4

是的,使用反射会产生成本。

但是,对整体应用程序性能的实际影响各不相同。一个经验法则是绝不会在代码中使用反射,这些代码会被执行多次,比如循环。这通常会导致算法以指数形式减速(O(c n))。

在许多情况下,您可以使用代表而不是反射编写通用代码,如this blog post中所述。

+0

您可以使用代表反射。 – leppie

1

是的,反射很慢。 您可以尝试通过缓存通过每反射类型的反射检索的xxxInfo(如MethodInfo,PropertyInfo等)对象来降低它的影响,并将它们保留为字典。字典中的后续查找比每次检索信息都快。

您也可以在SO上搜索关于反射性能的一些问题。对于某些边缘情况,可以使用CreateDelegate来调用方法,而不是使用MethodInfo.Invoke(),这是非常高效的解决方法。

0

除了通过反射来设置属性的速度较慢之外,这是一个设计问题,因为您显然已经通过面向对象设计分离了关注点或封装属性,而这些设计现在无法直接设置它们。我会说你看看你的设计(尽管可能有边缘案例),而不是思考反思。

除了性能影响外,其中一个缺点是您使用的是静态类型语言,因此编译器会检查您的代码并编译它。通常在编译时你可以确定你使用的所有属性都在那里,拼写正确。当你开始使用反射时,你将这个检查推到运行时,这是一个真正的耻辱,因为你(在我看来)缺少使用静态类型语言的最大好处之一。这也会限制你在未来(将来)的重构机会,因为如果你替换了所有的赋值,例如重命名一个属性,你就不再确定了。