hola Fernando, si sabes que tienes razon lo que porpones tambien funciona y queda aun mejor.
Lo que veo que paso es que uno empieza a pensar soluciones y toma un camino, en este caso era con generics, pero a veces uno ve solo el arbol pero pierde el bosque de vista. Que bueno que existen las listas y foros para que uno vea el bosque nuevamente. Gracias --- El jue 7-may-09, Fernando Tubio <[email protected]> escribió: De: Fernando Tubio <[email protected]> Asunto: [puntonet] Generics invocacion generica (utilizando typeof) Para: [email protected] Fecha: jueves, 7 de mayo de 2009, 3:48 pm Hola Leandro, Probablemente haya malinterpretado el problema pero, en el código original, ¿no podrías invocar a ApplyFormat<FormatInfo> (sin el typeof)? O sea, foreach (FormatInfo format in pivotTableInfo.Format) { ApplyFormat<FormatInfo>(sheet, pivotTable, format); } Es más, ¿es realmente necesario que ApplyFormat sea genérico si ya se sabe que recibe un parámetro de tipo FormatInfo? En el código reformado hay un método independiente para clase derivada, pero estos solo "forwardean" al método genérico. Aún cuando ApplyFormat<T> fuera invocado con una clase derivada no puede hacer uso de sus miembros a menos que en el cuerpo del método también existan ifs para cada clase derivada y se haga el cast correspondiente. Entonces no me queda claro para que debe existir un método diferente para cada una de las clases derivadas. ¿No serviría definirlo de la siguiente forma? private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, FormatInfo format) { // llamo a los métodos de FormatInfo format.AlgunMetodoDeLaClaseBase(); // para llamar a los métodos de alguna de sus clases derivadas es necesario // un cast, pero el cast sería igualmente necesario con el método genérico ((ButtonFormatInfo) format).UnMetodoDeButtonFormatInfo(); } y entonces el loop sería simplemente foreach (FormatInfo format in pivotTableInfo.Format) { ApplyFormat(sheet, pivotTable, format); } Saludos, Fernando Tubio ----- Original Message ----- From: Leandro Tuttini To: [email protected] Sent: Thursday, May 07, 2009 2:30 PM Subject: [puntonet] Generics invocacion generica (utilizando typeof) Hola, gracias a todos por las respuestas, fueron de utilidad. Modifique la implementacion quedando de esta forma: private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, ButtonFormatInfo format) { ApplyFormat<ButtonFormatInfo>(sheet, pivotTable, (ButtonFormatInfo)format); } private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, FieldFormatInfo format) { ApplyFormat<FieldFormatInfo>(sheet, pivotTable, (FieldFormatInfo)format); } private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, OriginFormatInfo format) { ApplyFormat<OriginFormatInfo>(sheet, pivotTable, (OriginFormatInfo)format); } private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, BlankFormatInfo format) { ApplyFormat<BlankFormatInfo>(sheet, pivotTable, (BlankFormatInfo)format); } private void ApplyFormat<T>(Office.Worksheet sheet, Office.PivotTable pivotTable, T format) where T : FormatInfo { } Para utilizarlo hago lo siguiente: foreach (FormatInfo format in pivotTableInfo.Format) ApplyFormat(sheet, pivotTable, format); Y la verdad quedo bastante bien, por supuesto agregue todo en una #region y quedo lindo. Al menos me libre del interminable if. gracias --- El jue 7-may-09, Daniel Calvin <[email protected]> escribió: De: Daniel Calvin <[email protected]> Asunto: [puntonet] Generics invocacion generica (utilizando typeof) Para: [email protected] Fecha: jueves, 7 de mayo de 2009, 11:59 am Hola Leandro Tal vez me equivoque, pero no me parace una buena forma de usar generics. Te doy mi opinion hacer: if (format is Mapping.PivotTableInfo.ButtonFormatInfo) ApplyFormat<ButtonFormatInfo>(sheet, pivotTable, (ButtonFormatInfo)format); no es una buena práctica Se me ocurren otras opciones: en vez de : private void ApplyFormat<T>(Office.Worksheet sheet, Office.PivotTable pivotTable, T format) where T : FormatInfo { } hacer: private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, FieldFormatInfo format) { } private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, ButtonFormatInfo format) { } private void ApplyFormat(Office.Worksheet sheet, Office.PivotTable pivotTable, FormatInfo format) { } Tener una firma por cada posible FormatInfo y uno que reciba el tipo base para los que no requieren particularidades. Me parece lo mas sano. Yo al menos no usaría generics para esto o al menos de esa manera. En la práctica preguntar por un type es comprar problemas.... Saludos Daniel Calvin El 7 de mayo de 2009 10:55, Leandro Tuttini <[email protected]> escribió: Hola, Les planteo la siguiente situacion. Tengo las siguientes clases: public abstract class FormatInfo { } public class FieldFormatInfo : FormatInfo { } public class ButtonFormatInfo : FormatInfo { } public class OriginFormatInfo : FormatInfo { } public class BlankFormatInfo : FormatInfo { } Y la siguiente implementacion: foreach (FormatInfo format in pivotTableInfo.Format) { //ApplyFormat<typeof(format)>(sheet, pivotTable, format); if (format is Mapping.PivotTableInfo.ButtonFormatInfo) ApplyFormat<ButtonFormatInfo>(sheet, pivotTable, (ButtonFormatInfo)format); else if (format is Mapping.PivotTableInfo.FieldFormatInfo) ApplyFormat<FieldFormatInfo>(sheet, pivotTable, (FieldFormatInfo)format); else if (format is Mapping.PivotTableInfo.OriginFormatInfo) ApplyFormat<OriginFormatInfo>(sheet, pivotTable, (OriginFormatInfo)format); else if (format is Mapping.PivotTableInfo.BlankFormatInfo) ApplyFormat<BlankFormatInfo>(sheet, pivotTable, (BlankFormatInfo)format); } pivotTableInfo.Format, es una propiedad del tipo: public List<FormatInfo> Format { get; set; } Y ApplyFormat() es un metodo: private void ApplyFormat<T>(Office.Worksheet sheet, Office.PivotTable pivotTable, T format) where T : FormatInfo { } Como veran funciona sin problema, pero la verdad no queda nada agradable a la vista, en realidad yo reduje un poco el ejemplo, hay unos 6 format mas que hacen el if bastante feo. por eso la cuestion es porque no puedo hacer algo asi: foreach (FormatInfo format in pivotTableInfo.Format) { ApplyFormat<typeof(format)>(sheet, pivotTable, format); } O sea la aplicacion del template seria dinamica. Se puede lograr algo parecido a esto ?, o la unica forma es con los if descubriendo el tipo. Saludos Yahoo! Cocina Recetas prácticas y comida saludable Visitá http://ar.mujer.yahoo.com/cocina/ -- Daniel A. Calvin Cooperator Team Member http://www.cooperator.com.ar Microsoft Certified Professional ¡Viví la mejor experiencia en la web! Descargá gratis el nuevo Internet Explorer 8 http://downloads.yahoo.com/ieak8/?l=ar Yahoo! Cocina Recetas prácticas y comida saludable http://ar.mujer.yahoo.com/cocina/
