Pregunta

Esto es lo que quiero hacer:

public [type determined at runtime] ImageToShow
{
  get
  {
    if(this.IsWebContext)
    {
       return this.GetString();
    }
    else
    {
       return this.GetBitmap();
    } 
  }
}

A primera vista, parece simple y factible si T era el tipo genérico que se creó con la instancia de esta clase. Pero lo que quiero hacer es servir una Cadena o un Mapa de bits basado en la determinación realizada dentro de la propiedad Imagen para que el conocimiento de qué servidor como Imagen esté contenido dentro de la propiedad Imagen y ningún otro lugar necesite saberlo. Ciertamente puedo hacer que el tipo de retorno sea 'objeto' y funcionará, pero no quiero ineficacia de boxeo y desempaquetado, ni quiero que se refleje.

Solo quería comprobar con ustedes si esto es posible antes de renunciar a esta idea.

¿Fue útil?

Solución

El boxeo ocurre cuando convierte un tipo de valor a un tipo de referencia.

int i = 5;

object o = i; // Boxing

Dado que solo devuelve String o un Bitmap , que son ambos tipos de referencia, puede usar objetos sin tener que preocuparse por el encajonamiento o el desempaquetado.

Otros consejos

¿No sería mejor para la persona que llama " saber " ;, usar una propiedad pública

YourClass.IsWebContext

¿qué esperar?

Entonces podría usar el tipo genérico T.

Parece que en lugar de evitar esto, debería considerar un diseño diferente. Por ejemplo, crear una clase separada para todo lo que será WebContext e implementar una interfaz común.

En primer lugar, devolver tipos de referencia como un objeto no es boxeo. El boxeo solo ocurre cuando se usa un tipo de valor como tipo de referencia.

Ahora supongamos que está utilizando el objeto returnntype. Luego puede verificar si la instancia del objeto que se devuelve es de cierto tipo utilizando el operador is .

object o = myClass.ImageToShow;

if (o is String)
{
  // Use as a String
}
else if (o is Bitmap)
{
  // Use as a Bitmap
}

En segundo lugar, no recomendaría verificar IsWebContext en cada propiedad. Tendría más sentido crear una clase base y especializarse dado el entorno en el que se utiliza.

Sí, use una interfaz.

   public interface IAmImage {}
   public class StringImage: IAmImage
   {
      private string img;
      public string Image { get { return img; } set { img = value; } }
      public StringImage(string image) { img = image;}
   }
   public class BitmapImage: IAmImage
   {
      private Bitmap img;
      public Bitmap Image { get { return img; } set { img = value; } }
      public BitmapImage(Bitmap image) { img = image;}
   }

... y en su código de cliente ...

   public IAmImage ImageToShow 
   {  
       get  
       {    
           return this.IsWebContext?
              new StringImage(this.GetString()):        
              new BitmapImage(this.GetBitmap());    
       }
   } 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top