martes, 6 de mayo de 2008

Cómo saber si un objeto es de un tipo, o si se puede "castear" o si implementa una interfaz.

Cómo saber si un objeto implementa una interfaz o hereda de una clase, o se puede castear

En ocasiones, sobre todo cuando la arquitectura de una aplicación comienza a hacerse compleja, recibimos objetos que necesitamos "castear" o hacer "boxing" contra un tipo base o una interfaz, esto puede pasar en muchos casos y nos es indispensable hacer el cast del estilo

Tipo objeto = (Tipo) otroObjeto;

Para que otroObjeto se convierta en Tipo y poder utilizar sus  métodos, etc. Bueno, vamos a ser brever y vamos directamente al código, no sin antes contarle que esto se logra verificando si nuestro objeto implementa o hereda de algo con el operador is, del modo

if(objeto is Tipo)

using System;
using System.Collections.Generic;
using System.Text;

namespace saberUnTipo
{
    class Program
    {
        static void Main(string[] args)
        {
            ClaseQueImplementaYHereda();
            ClaseSola();
            Console.ReadLine();
        }

        public static void ClaseQueImplementaYHereda()
        {
            ClasePrueba clasePrueba = new ClasePrueba();
            Console.WriteLine("Probando ClasePrueba");
            Console.WriteLine("Implementa MiInterfase {0}", (clasePrueba is MiInterfase));
            Console.WriteLine("Hereda de ClaseBase {0}", (clasePrueba is ClaseBase));
            Console.WriteLine("-------------------------------------------------");
        }

        public static void ClaseSola()
        {
            ClaseSola clasePrueba = new ClaseSola();
            Console.WriteLine("Probando ClaseSola");
            Console.WriteLine("Implementa MiInterfase {0}", (clasePrueba is MiInterfase));
            Console.WriteLine("Hereda de ClaseBase {0}", (clasePrueba is ClaseBase));
            Console.WriteLine("-------------------------------------------------");
        }
    }

    public class ClasePrueba: ClaseBase, MiInterfase
    {
    }

    public class ClaseSola
    {
    }

    public class ClaseBase
    {
    }

    public interface MiInterfase
    {
    }
}

Simple, hasta la próxima.