Reflection.Emit优于GetValue& SetValue:S

时间:2009-11-26 15:31:53

标签: c# reflection reflection.emit

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

4 个答案:

答案 0 :(得分:26)

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

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

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

答案 1 :(得分:11)

使用PropertyInfo.GetValue / SetValue

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

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

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

相关问题