改善绩效反思 - 我应该考虑哪些替代方案?

And*_*yMM 19 .net c# reflection performance

我需要动态设置对象上的值或属性的值,称之为传输对象.

将会创建相当数量的这些传输对象,并在短时间内设置其属性.我想避免使用反射.

还有替代品吗?如果是这样的样本实现我可以看一下?

Jon*_*eet 29

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

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


Mar*_*ell 7

在.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);
Run Code Online (Sandbox Code Playgroud)

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


yfe*_*lum 5

如果你做得对,反射可以非常快(当然,不如静态代码快)。

寻找财产设定者很慢。调用委托很快。

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