データベース クエリの結果を、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 を知っています。私は自分自身で似たようなものを実装して、より良い学習を支援したかっただけです。