在.Net中使用反射效果相当糟糕

本文关键字:反射 Net | 更新日期: 2023-09-27 18:06:38

可能重复:
Reflection的成本有多高?

为了使我的代码通用,我已经开始使用反射-在DTO对象中获得一些proerties并设置它们-

与硬编码的setter相比,使用反射来获取属性并设置它们会对性能产生如此严重的影响吗?

在.Net中使用反射效果相当糟糕

,使用反射会产生成本。

但是,对整个应用程序性能的实际影响各不相同。一条经验法则是永远不要在多次执行的代码中使用反射,例如循环。这通常会导致算法以指数方式减慢(O(cn((。

在许多情况下,您可以使用委托而不是反射来编写通用代码,如本文所述。

是的,反射很慢。您可以尝试通过缓存xxxInfo(如MethodInfo、PropertyInfo等(对象来减少它的影响,这些对象是通过每个反射类型的反射检索的,即将它们保存在字典中。在字典中的后续查找比每次检索信息更快。

您也可以在SO中搜索有关反射性能的一些问题。对于某些边缘情况,有一些性能很好的解决方法,比如使用CreateDelegate来调用方法,而不是使用MethodInfo.Invoke()

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

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