C# 使用反射将datareader转换为列表的最快方法
我正在使用反射将datareader转换为通用集合列表。谁能C# 使用反射将datareader转换为列表的最快方法,c#,asp.net,C#,Asp.net,我正在使用反射将datareader转换为通用集合列表。谁能 建议我实现此反射的最佳方法?我想要最快的方式?这实际上取决于你在做什么。我实现了一个对象/接口过程,在该过程中,我创建了保存返回数据的信息对象。然后,我使用一个接口IFillable或类似的东西,将DR传递给对象,然后对象从DR执行操作 这样我就避免了反射的需要,而且性能非常好。然后,我为Fill和FillCollection提供了一些通用的助手方法 我的想法是基于框架的CBO对象内部的东西。它还实现了一种反射方法,在性能上相当不错。
建议我实现此反射的最佳方法?我想要最快的方式?这实际上取决于你在做什么。我实现了一个对象/接口过程,在该过程中,我创建了保存返回数据的信息对象。然后,我使用一个接口
IFillable
或类似的东西,将DR传递给对象,然后对象从DR执行操作
这样我就避免了反射的需要,而且性能非常好。然后,我为Fill
和FillCollection
提供了一些通用的助手方法
我的想法是基于框架的CBO对象内部的东西。它还实现了一种反射方法,在性能上相当不错。我假设您想要做的是:
List<MyClass> list = LoadFromDataReader<MyClass>(dataReader);
我通过以下方式做到这一点:
Type.GetProperties
和PropertyInfo.GetCustomAttribute
将字段名称映射到PropertyInfo
对象的字典PropertyInfo.SetValue
- 使用
生成包含代码的C#类,以根据System.CodeDom
上的相应字段设置属性。请注意,IDataReader
在后台调用System.CodeDom
编译器,因此您需要在启动时生成此代码一次,并在每次调用时重复使用csc.exe
- 使用
生成设置属性的IL代码。与System.Reflection.Emit.DynamicMethod
相比,运行时开销更小,但由于生成的是原始IL,因此编写和调试起来要困难得多。作为最后一个选项使用System.CodeDom
数据表有什么不对?应该使用linq表达式而不是反射。相关的:
class MyClass
{
[DataField("FirstName")] public string FirstName { get; set; }
[DataField("LastName")] public string LastName { get; set; }
}