现在的版本是直接利用反射的,下一步将改编成利用快速反射
public static T ExcuteEntity<T>(SQLiteCommand cmd)
{
Type entityType = typeof(T);
PropertyInfo[] fieldinfos = entityType.GetProperties();
T entity = (T)Activator.CreateInstance(entityType);
DbDataReader reader = null;
if (conn == null || conn.Length == 0)
throw new ArgumentNullException("connectionString");
SQLiteConnection con = new SQLiteConnection(conn);
SQLiteTransaction trans = null;
PrepareCommand(cmd, con, ref trans, false, cmd.CommandType, cmd.CommandText);
try
{
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
reader.Read();
}
catch (Exception ex)
{
throw ex;
}
foreach (PropertyInfo field in fieldinfos)
{
int col=reader.GetOrdinal(field.Name);
if (col != -1)
{
Type mytype = reader.GetFieldType(col);
entityType.GetProperty(field.Name).SetValue(entity, Convert.ChangeType(reader.GetValue(col), mytype), null);
}
else {
continue;
}
}
return entity;
}
public static List<T> ExecuteCollection<T>(SQLiteCommand cmd) {
List<T> result = new List<T>();
Type entityType = typeof(T);
PropertyInfo[] fieldinfos = entityType.GetProperties();
DbDataReader reader = null;
if (conn == null || conn.Length == 0)
throw new ArgumentNullException("connectionString");
SQLiteConnection con = new SQLiteConnection(conn);
SQLiteTransaction trans = null;
PrepareCommand(cmd, con, ref trans, false, cmd.CommandType, cmd.CommandText);
try
{
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
throw ex;
}
while (reader.Read()) {
T entity = (T)Activator.CreateInstance(entityType);
foreach (PropertyInfo field in fieldinfos)
{
int col = reader.GetOrdinal(field.Name);
if (col != -1)
{
Type mytype = reader.GetFieldType(col);
entityType.GetProperty(field.Name).SetValue(entity, Convert.ChangeType(reader.GetValue(col), mytype), null);
}
else
{
continue;
}
}
result.Add(entity);
}
return result;
}