使用反射将datareader转换为列表的最快方法

时间:2009-05-01 16:08:36

标签: c# asp.net

我正在使用反射将datareader转换为通用集合列表。任何人都可以 建议我为此实现反思的最佳方法?我想要最快的路?

3 个答案:

答案 0 :(得分:6)

我认为你想要做的是:

List<MyClass> list = LoadFromDataReader<MyClass>(dataReader);

使用:

class MyClass
{
    [DataField("FirstName")] public string FirstName { get; set; }
    [DataField("LastName")] public string LastName { get; set; }
}

我是这样做的:

  1. 使用Type.GetPropertiesPropertyInfo.GetCustomAttribute将字段映射字段映射到PropertyInfo个对象
  2. 在每条记录中的每个字段上调用PropertyInfo.SetValue
  3. 您可以缓存步骤(1)的结果,因为字段/属性映射在应用程序的生命周期内不会发生变化。

    如果性能有问题(即如果步骤(2)成为瓶颈),则必须避免使用反射并生成代码以直接设置属性。一些替代改进:

    • 使用System.CodeDom生成包含代码的C#类,以根据IDataReader上的相应字段设置属性。请注意,System.CodeDom在后​​台调用csc.exe编译器,因此您需要在启动时生成此代码一次,并在每次调用时重复使用它。
    • 使用System.Reflection.Emit.DynamicMethod生成设置属性的IL代码。运行时开销小于System.CodeDom,但由于您生成原始IL,因此编写和调试起来要困难得多。用作最后一个选项。

答案 1 :(得分:1)

答案 2 :(得分:0)

这实际上取决于你正在做什么。我实现了一个对象/接口进程,我在其中创建了包含返回数据的信息对象。然后我使用接口IFillable或类似的东西将DR传递给对象,并且对象从DR中进行水合作用。

这样我就不需要反射,性能也很好。然后,我为FillFillCollection提供了一些通用帮助方法。

我基于DotNetNuke框架的CBO对象内的东西得到了这个想法。它也实现了一种反射方法,性能相当不错。