我正在使用反射将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 次 |
最近记录: |