有人告诉我使用Reflection.Emit而不是PropertyInfo.GetValue / SetValue,因为这样更快。但是我真的不知道Reflection.Emit有什么东西,也不知道如何用它来替代GetValue和SetValue。有人能帮我吗?
发布于 2009-11-27 00:40:17
这只是另一种答案;如果您想要性能,但需要一个类似的API -考虑HyperDescriptor;它在底层使用Reflection.Emit (所以您不必这样做),但在PropertyDescriptor API上公开它自己,所以您可以使用:
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);只需一行代码来启用它,它就可以处理所有的缓存等。
发布于 2009-11-26 23:45:22
如果您多次获取/设置相同的属性,那么使用某些东西来构建类型安全方法确实比反射更快。但是,我建议使用Delegate.CreateDelegate而不是Reflection.Emit。它更容易得到正确的结果,而且速度仍然非常快。
我在我的Protocol Buffers实现中使用了它,它与PropertyInfo.GetValue/SetValue有很大的不同。然而,正如其他人所说,只有在证明最简单的方法太慢之后才能这样做。
如果你决定沿着CreateDelegate的路线走下去,我有一个包含更多细节的blog post。
发布于 2009-11-26 23:43:27
使用PropertyInfo.GetValue/SetValue
如果有性能问题,请缓存PropertyInfo对象(不要重复调用GetProperty)
如果反射的使用是应用程序的性能瓶颈(如分析器中所示),则使用Delegate.CreateDelegate
如果你非常确定读/写值仍然是最糟糕的瓶颈,那么是时候开始学习在运行时生成IL的有趣世界了。
我真的怀疑这是否值得,每一个级别都会增加代码的复杂性,而不是提高性能-只有在必要的时候才这样做。
如果对属性的运行时访问是您的性能瓶颈,那么使用编译时访问可能更好(很难同时实现通用和超高性能)。
https://stackoverflow.com/questions/1804341
复制相似问题