我正在寻找将我的数据库查询结果映射到我的 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,我只是想自己实现类似的东西来帮助我更好地学习。