Méthodes d'extension pour les indexeurs, seraient-ils bons? Je jouais avec un code qui réhydrate les POCO.Méthodes d'extension pour les indexeurs, seraient-ils bons?
Le code parcourt les lignes renvoyées à partir d'un SqlDataReader et utilise la réflexion pour affecter des propriétés aux valeurs de colonne. Au bas de ma pile d'appels, j'ai eu un code une ligne comme ceci: -
poco.Set("Surname", "Smith"); // uses extension method ...
La méthode Set a été écrite comme une méthode d'extension.
Ce serait génial d'avoir pu écrire du code comme celui-ci
poco["Surname"] = "Smith"; // extension methods for indexers ?
-à-dire que je voulais écrire une méthode d'extension pour indexeur
Y at-il une bonne raison pour laquelle .Net n'a pas les méthodes d'extension pour les indexeurs? Est-ce que d'autres personnes ont d'autres bonnes utilisations pour les indexeurs de méthode d'extension?
en aparté ... Si nous pouvions écrire des méthodes d'extension pour indexeurs alors nous pourrions écrire du code comme ça ...
var poco = PocoFactory();
poco.Surname = “Smith”; // is this JavaScript ...
poco[Surname] = “Smith” ; // … or is this c# or both
Quelques extraits de mon code
/////////////////////////////////////////////
// Client calling code
IDab dab = DabFactory.Create("Northwind");
string sql = @"select * from Customers ";
var persons = dab.ExecuteReader<NorthwindCustomer>(sql);
if (dab != null{
Assert.That(persons[0].CustomerID , Is.EqualTo("ALFKI"));}
/////////////////////////////////////////////
List<T> IDab.ExecuteReader<T>(string commandText)
{
List<T> pocos = new List<T>();
// setup connection
SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
Dictionary<string, int> colMappings = null ;
if (colMappings == null){
colMappings = reader.GetSqlDataReaderColumnMappings();}
T poco = new T();
poco.DbToMem<T>(reader, colMappings);
pocos.Add(poco);
}
}
// connection cleanup ...
return pocos ;
}
// the set extension method signature
public static void Set<T>(this T thisClientObject, string thisPropertyName, object newValue) where T : class
merci, je vais jeter un oeil. – judek