我被告知使用Reflection.Emit而不是PropertyInfo.GetValue / SetValue,因为这种方式更快。 但我真的不知道Reflection.Emit是什么东西,以及如何用它来代替GetValue和SetValue。有人可以帮我吗?

有帮助吗?

解决方案

只是一个替代答案;如果您想要性能,但需要类似的API - 请考虑 HyperDescriptor ;这下面使用 Reflection.Emit (所以你不必),但是在 PropertyDescriptor API上公开自己,所以你可以使用:

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);

启用它的一行代码,它处理所有缓存等。

其他提示

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

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

我有一个博客帖子 CreateDelegate 路线前进,请提供更多详细信息。

使用PropertyInfo.GetValue / SetValue

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

如果 - 且仅当 - 使用反射是应用程序的性能瓶颈(如在分析器中看到的那样)使用Delegate.CreateDelegate

如果 - 而且真的只是 - 你绝对肯定读取/写入值仍然是最糟糕的瓶颈,是时候开始学习在运行时生成IL的有趣世界了。

我真的怀疑它是值得的,每个级别都增加了代码的复杂性,然后它们提高了性能 - 只有在必要时才执行它们。

如果对属性的运行时访问是性能瓶颈,则可能更适合编译时访问(同时很难同时具有通用性和超高性能)。

Reflection.Emit的目的与PropertyInfo.Get / SetValue完全不同。通过Reflection.Emit,您可以直接发出IL代码,例如进入动态编译的程序集,并执行此代码。当然,此代码可以访问您的属性。

我严重怀疑这最终会比使用PropertyInfo快得多,而且也不是为了这个目的而做的。例如,您可以使用Reflection.Emit作为小编译器的代码生成器。

使用Reflection.Emit似乎有点过于“聪明”,以及过早的优化。如果您对应用程序进行了概要分析,并且发现GetValue / SetValue Reflection是瓶颈,那么您可以考虑进行优化,但可能不会那么......

scroll top