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/

Responder a