我被告知使用Reflection.Emit而不是PropertyInfo.GetValue / SetValue,因为这种方式更快。 但我真的不知道Reflection.Emit是什么东西,以及如何用它来代替GetValue和SetValue。有人可以帮我吗?
答案 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是瓶颈,那么您可以考虑进行优化,但可能不会那么......