I am using reflection to convert datareader into the generic collection list. Can anybody suggest me the best way to implement reflection for this? I want the fastestway?
-
What do you mean by "generic collection list"? What's wrong with using a `DataTable`? – Keltex May 01 '09 at 16:19
-
Should use linq expressions instead of reflection. Related: http://stackoverflow.com/questions/19841120/generic-dbdatareader-to-listt-mapping – nawfal Aug 01 '15 at 12:04
2 Answers
I assume what you want to do is something like:
List<MyClass> list = LoadFromDataReader<MyClass>(dataReader);
with:
class MyClass
{
[DataField("FirstName")] public string FirstName { get; set; }
[DataField("LastName")] public string LastName { get; set; }
}
I do this by:
- Using
Type.GetProperties
andPropertyInfo.GetCustomAttribute
to put together a dictionary mapping field names toPropertyInfo
objects - Calling
PropertyInfo.SetValue
on each field in each record
You can cache the results of step (1), since the field/property mapping isn't going to change during the life of the application.
If performance is a problem (i.e. if step (2) turns out to be a bottleneck), then you have to avoid using reflection and generate code to set the properties directly. A couple of alternative improvements:
- Use
System.CodeDom
to generate a C# class containing code to set the properties according to the respective fields on theIDataReader
. Note thatSystem.CodeDom
invokes thecsc.exe
compiler in the background, so you need to generate this code once at startup and re-use it on each call. - Use
System.Reflection.Emit.DynamicMethod
to generate IL code that sets properties. Less runtime overhead thanSystem.CodeDom
, but since you're generating raw IL, this is much harder to write and debug. Use as a last option.

- 53,480
- 10
- 121
- 138
This really depends on exactly what you are looking at doing. I implement a object/interface process where I create information objects that hold the data that is returned. I then use an interface IFillable
or something similar that passes a DR to the object and the object does the hydration from the DR.
This way I avoid the need for reflection, and the performance is great. I then have a few generic helper methods for Fill
and FillCollection
.
I got the idea based on stuff inside the CBO object of the DotNetNuke framework. It also implements a reflection method as well, that is fairly decent in performance.

- 70,104
- 56
- 326
- 368

- 62,228
- 14
- 110
- 173