使用reflection将datareader转换为列表的最快方法
我正在使用reflection将datareader转换为通用集合列表。 任何人都可以建议我为此实现reflection的最佳方法吗? 我想要最快的路?
我假设你想做的事情是这样的:
List list = LoadFromDataReader (dataReader);
有:
class MyClass { [DataField("FirstName")] public string FirstName { get; set; } [DataField("LastName")] public string LastName { get; set; } }
我是这样做的:
- 使用
Type.GetProperties
和PropertyInfo.GetCustomAttribute
将字典映射字段名称放到PropertyInfo
对象中 - 在每条记录的每个字段上调用
PropertyInfo.SetValue
您可以缓存步骤(1)的结果,因为字段/属性映射在应用程序的生命周期中不会更改。
如果性能是一个问题(即如果步骤(2)结果是瓶颈),那么您必须避免使用reflection并生成代码来直接设置属性。 一些替代改进:
- 使用
System.CodeDom
生成包含代码的C#类,以根据IDataReader
上的相应字段设置属性。 请注意,System.CodeDom
在后台调用csc.exe
编译器,因此您需要在启动时生成此代码一次,并在每次调用时重新使用它。 - 使用
System.Reflection.Emit.DynamicMethod
生成设置属性的IL代码。 比System.CodeDom
更少的运行时开销,但由于您正在生成原始IL,因此编写和调试起来要困难得多。 用作最后一个选项。
这就是我认为你在寻找的东西。
这实际上取决于你正在做什么。 我实现了一个对象/接口进程,我在其中创建了包含返回数据的信息对象。 然后我使用接口IFillable
或类似的东西将DR传递给对象,并且对象从DR进行水合作用。
这样我就不需要reflection,性能也很好。 然后,我为Fill
和FillCollection
提供了一些通用的辅助方法。
我基于DotNetNuke框架的CBO对象内部的东西得到了这个想法。 它也实现了一种reflection方法,性能相当不错。