Bonjour, J'ai créé ma première méthode générique reconstituée à partir d'un tas de recherches Google. J'aimerais que quelqu'un me regarde et me dise si je ne respecte pas les règles importantes ou s'il y a des façons d'améliorer cette méthode.Méthode générique. Assigner des propriétés d'un DataReader à des objets génériques
La méthode appelle une procédure stockée dans sql, puis utilise la réflexion pour affecter les propriétés en fonction des valeurs lues dans le schéma DataReader. Les procédures stockées sont codées de sorte qu'elles renvoient les noms de propriété exacts attendus par les classes. Voici le code:
public static List<T> GetList<T>(string SQLServer, string DBName,
string ProcedureName, Dictionary<string, string> Parameters)
where T : new()
{
List<T> list = new List<T>();
//Setup connection to SQL
SqlConnection SqlConn = new SqlConnection(ConnectionString(SQLServer, DBName));
SqlCommand SqlCmd = new SqlCommand(ProcedureName, SqlConn);
SqlCmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader reader;
//Process Parameters if there are any
foreach (KeyValuePair<string, string> param in Parameters)
{
SqlCmd.Parameters.AddWithValue(param.Key, param.Value);
}
SqlConn.Open();
reader = SqlCmd.ExecuteReader();
//Get The Schema from the Reader
//The stored procedure has code to return
//the exact names expected by the properties of T
DataTable schemaTable = reader.GetSchemaTable();
List<string> fields = new List<string>();
foreach (DataRow r in schemaTable.Rows)
{
fields.Add(r[0].ToString());
}
while (reader.Read())
{
T record = new T();
foreach (string field in fields)
{
//Assign the properties using reflection
record.GetType().GetProperty(field).SetValue(
record, reader[field],
System.Reflection.BindingFlags.Default,
null,null,null);
}
list.Add(record);
}
return list;
}
Avez-vous considéré Linq To SQL? http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx – xcud
Les actions Db ont un coût. Ajoutez du reflet à ça, ça va être sensiblement plus lent. Pire, vous le faites dans la boucle. Vous devriez déplacer la partie de réflexion en dehors de la boucle, et de préférence compter sur les arbres d'expression au lieu de la réflexion. Voir cette réponse http://stackoverflow.com/a/19845980/661933 pour, par exemple, – nawfal
Connexe: http://stackoverflow.com/questions/812034/fastest-way-to-use-reflection-for-converting-datareader-to-list, http://stackoverflow.com/questions/1105549/c-sharp -idatareader-to-object-mapping-using-generics – nawfal