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
and PropertyInfo.GetCustomAttribute
to put together a dictionary mapping field names to PropertyInfo
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 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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…