Omu*_*Omu 16 c# reflection reflection.emit
我被告知使用Reflection.Emit而不是PropertyInfo.GetValue/SetValue,因为这种方式更快.但我真的不知道Reflection.Emit是什么东西,以及如何用它来代替GetValue和SetValue.任何人都可以帮我吗?
Mar*_*ell 26
只是一个替代答案; 如果你想要性能,但是类似的API - 考虑HyperDescriptor ; 这Reflection.Emit在下面使用(所以你不必),但在PropertyDescriptorAPI 上暴露自己,所以你可以使用:
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);
Run Code Online (Sandbox Code Playgroud)
一行代码启用它,它处理所有缓存等.
Jon*_*eet 22
如果您多次获取/设置相同的属性,那么使用某些东西构建一个类型安全的方法确实会比反射更快.但是,我建议使用Delegate.CreateDelegate而不是Reflection.Emit.它更容易做对,它仍然非常快.
我在我的Protocol Buffers的实现中使用这一点,它取得了巨大的差异VS PropertyInfo.GetValue/SetValue.正如其他人所说,只有在证明最简单的方法太慢之后才这样做.
如果您决定沿着这条路走下去,我会有一篇博文,内容更详细CreateDelegate.
Nir*_*Nir 11
使用PropertyInfo.GetValue/SetValue
如果遇到性能问题,请缓存PropertyInfo对象(不要重复调用GetProperty)
如果 - 且仅当 - 使用反射是应用程序的性能瓶颈(如在分析器中看到的那样)使用Delegate.CreateDelegate
如果 - 而且确实只是 - 你绝对肯定读取/写入值仍然是最糟糕的瓶颈,是时候开始学习在运行时生成IL的有趣世界了.
我真的怀疑它是值得的,每个级别都会增加代码的复杂性,然后它们会提高性能 - 只有在必要的情况下才能执行它们.
如果对属性的运行时访问是性能瓶颈,则可能更适合编译时访问(同时很难同时具有通用性和超高性能).