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

Jal*_*ama 2 c# asp.net

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

Tim*_*son 6

我假设你想做的事情是这样的:

List<MyClass> list = LoadFromDataReader<MyClass>(dataReader);
Run Code Online (Sandbox Code Playgroud)

有:

class MyClass
{
    [DataField("FirstName")] public string FirstName { get; set; }
    [DataField("LastName")] public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我是这样做的:

  1. 使用Type.GetPropertiesPropertyInfo.GetCustomAttribute组合字典将字段名称映射到PropertyInfo对象
  2. 调用PropertyInfo.SetValue每条记录中的每个字段

您可以缓存步骤(1)的结果,因为字段/属性映射在应用程序的生命周期中不会更改.

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

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