我正在使用反射将datareader转换为通用集合列表.任何人都可以建议我为此实现反射的最佳方法吗?我想要最快的路?
我假设你想做的事情是这样的:
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)
我是这样做的:
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,因此编写和调试起来要困难得多.用作最后一个选项.| 归档时间: |
|
| 查看次数: |
5144 次 |
| 最近记录: |