改善性能反映,我应该考虑哪些替代方案

我需要动态设置对象上的值或属性的值,将其称为传输对象。 将会创建相当数量的这些传输对象并在短时间内设置其属性。我想避免使用reflection,是否有替代? 如果是这样的样本实现我可以看一下?

谢谢

使用Delegate.CreateDelegateMethodInfo转换为强类型委托。 这可以大大提高性能。 我有一个关于此的博客文章,带有示例代码。 请注意,如果您需要多次设置相同的属性,这只会有所帮助 – 基本上这意味着在创建委托时,而不是在每次调用时,都会进行一次类型检查。

Marc Gravell有一个HyperPropertyDescriptor项目,可以实现更好的性能,但引入了额外的依赖性。 这个项目成为更现代的Fast Member ( github )的起点。 通常,您将使用Fast Member而不是HyperProperty。

在.NET 4.0(beta)中,您可以使用Expression.BlockExpression.Assign对更新的表达式树执行此操作,然后将其编译为类型化的委托; 任务完成。

在.NET 2.0及更高版本中(如Jon所述),HyperDescriptor是一个合理的选项 – 它可以作为自定义的PropertyDescriptor实现,所以你只需要执行以下代码:

 // store this collection for optimum performance PropertyDescriptorCollection props = TypeDescriptor.GetProperties( typeof(SomeType)); props["Name"].SetValue(obj, newName); props["DateOfBirth"].SetValue(obj, newDoB); 

这仍然有一点拳击,但这实际上不是一个瓶颈。

如果你做得对,reflection可以非常快(当然不像静态代码那么快)。

找到一个属性设置器很慢。 调用委托很快。

您需要为每种类型的DTO上的每个属性设置器获取和缓存Delegate对象。 这是缓慢的部分,但这是一次性的打击。 然后,您可以为给定DTO类型的属性设置器Invoke每个缓存的委托,传入DTO对象和新属性值,但这部分将非常快。

您是否确定使用reflection太慢了? 尽管.NET中的reflection速度不如静态代码 ,但它仍然非常快。 您应该以尽可能最简单的方式编写代码 – 即使它使用reflection – 只有在您发现性能问题并将它们与您使用reflection隔离时才会回来进行优化。 大多数时候,你不会有任何问题。 reflection用于各种性能敏感的代码,例如ASP.NET MVC。

reflection从Java得到了一个糟糕的代表,它在(或者至少曾经)非常慢。 在.net中并非如此,所以我不理解您对使用它的反对意见。 我同意雷克斯,你不能说没有实际测量的东西表现不佳。