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

C# 使用反射将datareader转换为列表的最快方法,c#,asp.net,C#,Asp.net,我正在使用反射将datareader转换为通用集合列表。谁能 建议我实现此反射的最佳方法?我想要最快的方式?这实际上取决于你在做什么。我实现了一个对象/接口过程,在该过程中,我创建了保存返回数据的信息对象。然后,我使用一个接口IFillable或类似的东西,将DR传递给对象,然后对象从DR执行操作 这样我就避免了反射的需要,而且性能非常好。然后,我为Fill和FillCollection提供了一些通用的助手方法 我的想法是基于框架的CBO对象内部的东西。它还实现了一种反射方法,在性能上相当不错。

我正在使用反射将datareader转换为通用集合列表。谁能
建议我实现此反射的最佳方法?我想要最快的方式?

这实际上取决于你在做什么。我实现了一个对象/接口过程,在该过程中,我创建了保存返回数据的信息对象。然后,我使用一个接口
IFillable
或类似的东西,将DR传递给对象,然后对象从DR执行操作

这样我就避免了反射的需要,而且性能非常好。然后,我为
Fill
FillCollection
提供了一些通用的助手方法


我的想法是基于框架的CBO对象内部的东西。它还实现了一种反射方法,在性能上相当不错。

我假设您想要做的是:

List<MyClass> list = LoadFromDataReader<MyClass>(dataReader);
我通过以下方式做到这一点:

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

    如果性能是一个问题(即,如果步骤(2)被证明是一个瓶颈),那么您必须避免使用反射并生成代码来直接设置属性。两个替代改进:

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

    您可以使用Lambda表达式作为反射发射的替代方法。您所说的“通用集合列表”是什么意思?使用
    数据表有什么不对?应该使用linq表达式而不是反射。相关的:
    
    class MyClass
    {
        [DataField("FirstName")] public string FirstName { get; set; }
        [DataField("LastName")] public string LastName { get; set; }
    }