3

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?

Jalpesh Vadgama
  • 13,653
  • 19
  • 72
  • 94
  • 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 Answers2

7

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:

  1. Using Type.GetProperties and PropertyInfo.GetCustomAttribute to put together a dictionary mapping field names to PropertyInfo objects
  2. 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 the IDataReader. Note that System.CodeDom invokes the csc.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 than System.CodeDom, but since you're generating raw IL, this is much harder to write and debug. Use as a last option.
Tim Robinson
  • 53,480
  • 10
  • 121
  • 138
0

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.

nawfal
  • 70,104
  • 56
  • 326
  • 368
Mitchel Sellers
  • 62,228
  • 14
  • 110
  • 173