IDataReader - ToEntity
An IDataReader extension method that converts the @this to an entity.
public static void Main() { string sql = "SELECT 1 AS IntColumn, 'FizzBuzz' AS StringColumn UNION SELECT 2, 'BuzzBuzz'"; using (var conn = new SqlConnection(FiddleHelper.GetConnectionStringSqlServer())) { conn.Open(); using (DbCommand command = conn.CreateCommand()) { command.CommandText = sql; using (IDataReader reader = command.ExecuteReader()) { reader.Read(); //C# Extension Method: IDataReader - ToEntity var result = reader.ToEntity<TestObject>(); Console.WriteLine(result.IntColumn); Console.WriteLine(result.StringColumn); } } } } public class TestObject { public int IntColumn { get; set; } public string StringColumn { get; set; } }
View Source
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; public static partial class Extensions { /// <summary> /// An IDataReader extension method that converts the @this to an entity. /// </summary> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="this">The @this to act on.</param> /// <returns>@this as a T.</returns> public static T ToEntity<T>(this IDataReader @this) where T : new() { Type type = typeof (T); PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); var entity = new T(); var hash = new HashSet<string>(Enumerable.Range(0, @this.FieldCount) .Select(@this.GetName)); foreach (PropertyInfo property in properties) { if (hash.Contains(property.Name)) { Type valueType = property.PropertyType; property.SetValue(entity, @this[property.Name].To(valueType), null); } } foreach (FieldInfo field in fields) { if (hash.Contains(field.Name)) { Type valueType = field.FieldType; field.SetValue(entity, @this[field.Name].To(valueType)); } } return entity; } }