Я искал, чтобы сопоставить результаты моего запроса к базе данных со строгим типом объектов в моем коде c #.Поэтому я написал быстрый и грязный вспомогательный метод для класса SqlConnection, который выполняет запрос к базе данных и использует отражение для сопоставления столбцов записи со свойствами объекта.Код ниже:
public static T Query<T>(this SqlConnection conn, string query) where T : new()
{
T obj = default(T);
using (SqlCommand command = new SqlCommand(query, conn))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
obj = new T();
PropertyInfo[] propertyInfos;
propertyInfos = typeof(T).GetProperties();
for (int i = 0; i < reader.FieldCount; i++)
{
var name = reader.GetName(i);
foreach (var item in propertyInfos)
{
if (item.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase) && item.CanWrite)
{
item.SetValue(obj, reader[i], null);
}
}
}
}
}
}
return obj;
}
public class User
{
public int id { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
public DateTime signupDate { get; set; }
public int age { get; set; }
public string gender { get; set; }
}
var user = conn.Query<User>("select id,firstname,lastname from users");
Я просто хотел получить второе мнение о моем подходе, приведенном выше, об использовании отражения, чтобы связать значения вместе, если есть что-то, что я могу сделать лучше в приведенном выше коде,Или, если есть какой-то другой, совершенно другой подход, который я могу использовать, чтобы получить тот же результат?
Я думаю, что, возможно, я смогу улучшить код в вспомогательном методе, удалив цикл для propertyInfos и используя вместо него словарь.Есть ли что-то еще, что нужно настроить?
PS: я знаю о Dapper, я просто хотел реализовать нечто подобное самостоятельно, чтобы помочь мне учиться лучше.