可能重复:
反射有多么昂贵?
出于使我的代码通用的目的,我开始使用反射 - 获取DTO对象中的一些属性并对其进行设置 -
与硬编码的setter相比,使用反射获取属性并对其进行设置会对性能产生如此严重的影响吗?
可能重复:
反射有多么昂贵?
出于使我的代码通用的目的,我开始使用反射 - 获取DTO对象中的一些属性并对其进行设置 -
与硬编码的setter相比,使用反射获取属性并对其进行设置会对性能产生如此严重的影响吗?
是的,反射确实很慢。你可以试着通过将通过反射检索得到的 xxxInfo
(例如 MethodInfo、PropertyInfo 等)对象缓存到每个反射类型中,并将它们保存在一个字典中来减少其影响。字典中的后续查找比每次检索信息要快。
你也可以在这里搜索一些关于反射性能的问题。对于某些边缘情况,有一些相当有效的解决方法,如使用CreateDelegate
调用方法而不是使用MethodInfo.Invoke()
。
除了速度较慢之外,通过反射设置属性是一个设计问题,因为您显然已经通过面向对象设计分离了关注点或封装了属性,这现在阻止您直接设置它们。我建议您查看设计(虽然可能存在边缘情况),而不是考虑反射。
除了性能影响之外,其中一个缺点是您正在使用静态类型语言,因此编译器检查您的代码并将其编译。通常,在编译时,您可以确定您使用的所有属性都存在且拼写正确。当您开始使用反射时,您将此检查推迟到运行时,这真是太糟糕了,因为您(在我看来)错过了使用静态类型语言的最大好处之一。这也会限制您在(近)未来进行重构的机会,因为您不再确定在重命名属性时是否替换了所有赋值的出现次数。