que metodos metodo matematicas extensión extension clases c# methods data-access-layer indexer

c# - metodos - Métodos de extensión para indexadores, ¿serían buenos?



metodo de extensión matematicas (2)

Los indexadores comparten muchas características comunes con las propiedades (bajo el capó, un indexador es una propiedad con un índice) y las propiedades de extensión no existen. De acuerdo, habría escenarios en los que son útiles.

En el escenario presentado, de alguna manera, esto es bastante dynamic . Por supuesto, si declara una interfaz que tiene un indexador de cadenas, entonces su código lector podría usarlo directamente, pero sería una tarea innecesaria implementar esta interfaz repetidamente.

Re el método de extensión; ¿Utiliza esto una reflexión regular? Es posible que desee ver trucos como HyperDescriptor , lo que puede ahorrar mucho tiempo de CPU si está haciendo mucho de esto. El uso típico sería entonces:

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); while (reader.Read()) { T poco = new T(); // abbreviated... (per prop) props[propName].SetValue(poco, cellValue); }

Puede optimizar esto aún más mirando primero las columnas devueltas (una por cuadrícula, no por fila), y solo accediendo a columnas coincidentes ...

O alternativamente, mira las herramientas ORM; Expression también se puede usar para realizar la lectura de datos (tengo un ejemplo completo de esto en algún lugar de Usenet, para DbLinq)

Métodos de extensión para indexadores, ¿serían buenos?

Estaba jugando con un código que rehidrata POCO.

El código itera alrededor de las filas devueltas desde un SqlDataReader y utiliza la reflexión para asignar propiedades a partir de valores de columna. En mi pila de llamadas tenía un código de una línea como esta:

poco.Set("Surname", "Smith"); // uses extension method ...

El método Set se escribió como un método de extensión.

Sería genial haber podido escribir código como este

poco["Surname"] = "Smith"; // extension methods for indexers ?

es decir, quería escribir un método de extensión para indexador

¿Hay una buena razón por la cual .Net no tiene métodos de extensión para los indexadores? ¿Otras personas tienen otros buenos usos para los indexadores de método de extensión?

como un aparte ... Si pudiéramos escribir métodos de extensión para indexadores, podríamos escribir código como este ...

var poco = PocoFactory(); poco.Surname = “Smith”; // is this JavaScript ... poco[Surname] = “Smith” ; // … or is this c# or both

Algunos fragmentos de mi código

///////////////////////////////////////////// // 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


Para rehidratar Pocos, recomendaría echarle un vistazo al paquete AutoMapper Nuget. Hace que sea realmente simple y reduce en gran medida la cantidad de código.