我正在使用反射将数据读取器转换为通用集合列表。 有人能建议我实现这个反射的最佳方法吗? 我想要最快的方式?
List<MyClass> list = LoadFromDataReader<MyClass>(dataReader);
使用:
class MyClass
{
[DataField("FirstName")] public string FirstName { get; set; }
[DataField("LastName")] public string LastName { get; set; }
}
Type.GetProperties
和 PropertyInfo.GetCustomAttribute
来创建一个将字段名映射到 PropertyInfo
对象的字典。PropertyInfo.SetValue
。可以缓存步骤(1)的结果,因为字段/属性映射不会在应用程序生命周期内更改。
如果性能是问题(即如果步骤(2)成为瓶颈),则必须避免使用反射并生成代码以直接设置属性。几种替代改进方法:
System.CodeDom
生成包含根据 IDataReader
上的相应字段设置属性的代码的 C# 类。请注意,System.CodeDom
在后台调用 csc.exe
编译器,因此您需要在启动时生成此代码,并在每次调用时重复使用它。System.Reflection.Emit.DynamicMethod
生成设置属性的 IL 代码。比 System.CodeDom
有更少的运行时开销,但由于生成原始 IL,因此编写和调试要困难得多。作为最后一种选择使用。IFillable
或类似的接口,将一个DR传递给对象,对象从DR中进行填充。Fill
和FillCollection
。
DataTable
有什么问题吗? - Keltex