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.GetPropertiesandPropertyInfo.GetCustomAttributeto put together a dictionary mapping field names toPropertyInfoobjects - Calling
PropertyInfo.SetValueon 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.CodeDomto generate a C# class containing code to set the properties according to the respective fields on theIDataReader. Note thatSystem.CodeDominvokes thecsc.execompiler in the background, so you need to generate this code once at startup and re-use it on each call. - Use
System.Reflection.Emit.DynamicMethodto 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