首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reflection.Emit优于GetValue和SetValue :S

Reflection.Emit优于GetValue和SetValue :S
EN

Stack Overflow用户
提问于 2009-11-26 23:31:53
回答 5查看 15.1K关注 0票数 17

有人告诉我使用Reflection.Emit而不是PropertyInfo.GetValue / SetValue,因为这样更快。但是我真的不知道Reflection.Emit有什么东西,也不知道如何用它来替代GetValue和SetValue。有人能帮我吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-27 00:40:17

这只是另一种答案;如果您想要性能,但需要一个类似的API -考虑HyperDescriptor;它在底层使用Reflection.Emit (所以您不必这样做),但在PropertyDescriptor API上公开它自己,所以您可以使用:

代码语言:javascript
复制
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);

只需一行代码来启用它,它就可以处理所有的缓存等。

票数 26
EN

Stack Overflow用户

发布于 2009-11-26 23:45:22

如果您多次获取/设置相同的属性,那么使用某些东西来构建类型安全方法确实比反射更快。但是,我建议使用Delegate.CreateDelegate而不是Reflection.Emit。它更容易得到正确的结果,而且速度仍然非常快。

我在我的Protocol Buffers实现中使用了它,它与PropertyInfo.GetValue/SetValue有很大的不同。然而,正如其他人所说,只有在证明最简单的方法太慢之后才能这样做。

如果你决定沿着CreateDelegate的路线走下去,我有一个包含更多细节的blog post

票数 23
EN

Stack Overflow用户

发布于 2009-11-26 23:43:27

使用PropertyInfo.GetValue/SetValue

如果有性能问题,请缓存PropertyInfo对象(不要重复调用GetProperty)

如果反射的使用是应用程序的性能瓶颈(如分析器中所示),则使用Delegate.CreateDelegate

如果你非常确定读/写值仍然是最糟糕的瓶颈,那么是时候开始学习在运行时生成IL的有趣世界了。

我真的怀疑这是否值得,每一个级别都会增加代码的复杂性,而不是提高性能-只有在必要的时候才这样做。

如果对属性的运行时访问是您的性能瓶颈,那么使用编译时访问可能更好(很难同时实现通用和超高性能)。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1804341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档