我需要动态地设置在一堆或属性值的对象上,把它的传输对象。
将有相当数量的将被创建,并在很短的时间空间设置其属性这些传输对象。 我想避免使用反射。
有没有办法? 如果是的话有没有样品的实现,我可以看看?
我需要动态地设置在一堆或属性值的对象上,把它的传输对象。
将有相当数量的将被创建,并在很短的时间空间设置其属性这些传输对象。 我想避免使用反射。
有没有办法? 如果是的话有没有样品的实现,我可以看看?
使用Delegate.CreateDelegate
把一个MethodInfo
成强类型的代表。 这可以大量提高性能。 我有一个博客帖子这个示例代码。 请注意,这只会帮助,如果你需要多次设置相同的属性-基本上这意味着,当你创建委托很多类型检查都做完了一次 ,而不是每次调用。
马克Gravell有HyperPropertyDescriptor项目,达到了更好的性能,但引入了额外的依赖。 该项目成为了更现代的跳点快速会员 ( github上 )。 一般来说,你会使用快速会员超过HyperProperty。
在.NET 4.0(测试版),您可以用更新的表达式树做到这一点,利用Expression.Block
和Expression.Assign
-然后编译一个类型的代表; 任务完成。
在.NET 2.0及以上(如乔恩提及)HyperDescriptor是一个合理的选择-它可以作为一个定制PropertyDescriptor
实现,所以你只是做这样的代码:
// store this collection for optimum performance
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
typeof(SomeType));
props["Name"].SetValue(obj, newName);
props["DateOfBirth"].SetValue(obj, newDoB);
这仍然有一个小拳,但实际上不是一个瓶颈。
反射可以,如果你这样做的权利 (不一样快,静态代码,当然)极快。
寻找一个属性制定者是缓慢的。 调用委托快。
你需要得到和缓存Delegate
对象,以便在每种类型的DTO的每个属性的制定者。 这是缓慢的一部分,但它是一个一次性的打击。 然后,你可以Invoke
每一个给定DTO类型的物业制定者缓存的代表,传递DTO对象和新的属性值,但是这部分将是非常快的。
你肯定确定,使用反射太慢? 虽然在.NET反射不一样快 ,静态代码,它仍然是非常快的。 你应该写在可能的最简单的方法的代码 - 即使使用反射 - 只有回来,如果你发现性能问题,并将其隔离到您使用反射来优化。 大多数时候,你不会有任何问题。 反射在各种性能敏感的代码,如ASP.NET MVC使用。
反映了从Java坏名声在那里(或至少曾经是)非常缓慢。 这不是在.NET中的情况下,所以我不明白,使用它你的异议。 我也同意雷克斯,你不能说什么有没有实际测量性能较差。
您可以使用轻量级的代码生成。 这里有一些文章: