Reflection.Emit比GetValue和SetValue更好:S

我被告知使用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); 

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

如果你多次获取/设置相同的属性,那么使用某些东西构建一个类型安全的方法确实会比reflection更快。 但是,我建议使用Delegate.CreateDelegate而不是Reflection.Emit。 它更容易做对,它仍然非常快。

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

如果您决定沿着CreateDelegate路线走下去,我会有一篇博文,其中包含更多详细信息。

使用PropertyInfo.GetValue / SetValue

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

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

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

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

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

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

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

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