.NET 利用反射来实现SQL Server 查询扩展
简单的造个轮子
获取数据库中的字段名,实例化泛型T,利用反射中的GetProperty方法获取泛型T中的成员(Property)并使用SetValue方法设置值
public static class SqlExtension
{
public static IEnumerable<T> QueryForList<T>(this SqlConnection conn, string sql, params SqlParameter[] parameters) where T : class
{
Type entity = typeof(T);
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
object instance = Activator.CreateInstance(entity);
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
string name = reader.GetName(i);
PropertyInfo propertyInfo = entity.GetProperty(name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (propertyInfo != null)
{
if (reader.GetValue(i) == DBNull.Value)
{
if (propertyInfo.PropertyType == typeof(string) || propertyInfo.PropertyType == typeof(int?))
propertyInfo.SetValue(instance, null);
else if (propertyInfo.PropertyType == typeof(int) || propertyInfo.PropertyType == typeof(decimal))
propertyInfo.SetValue(instance, 0);
}
else
propertyInfo.SetValue(instance, reader.GetValue(i));
}
}
yield return instance as T;
}
}
}
public static T QueryFirstOrDefault<T>(this SqlConnection conn,string sql, params SqlParameter[] parameters) where T : class
{
Type entity = typeof(T);
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
object instance = Activator.CreateInstance(entity);
using (IDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
string name = reader.GetName(i);
PropertyInfo propertyInfo = entity.GetProperty(name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (propertyInfo != null)
{
if (reader.GetValue(i) == DBNull.Value)
{
if (propertyInfo.PropertyType == typeof(string) || propertyInfo.PropertyType == typeof(int?))
propertyInfo.SetValue(instance, null);
else if (propertyInfo.PropertyType == typeof(int) || propertyInfo.PropertyType == typeof(decimal))
propertyInfo.SetValue(instance, 0);
}
else
propertyInfo.SetValue(instance, reader.GetValue(i));
}
}
return instance as T;
}
}
return null;
}
}