Cómo trabajar con la reflexión en C #

La reflexión en C # se usa para recuperar metadatos sobre tipos en tiempo de ejecución. En otras palabras, puede utilizar la reflexión para inspeccionar los metadatos de los tipos en su programa de forma dinámica; puede recuperar información sobre los ensamblados cargados y los tipos definidos en ellos. La reflexión en C # es similar a RTTI (información de tipo de tiempo de ejecución) de C ++.

Para trabajar con la reflexión en .Net, debe incluir el espacio de nombres System.Reflection en su programa. Al usar la reflexión, obtienes objetos del tipo "Tipo" que se pueden usar para representar ensamblajes, tipos o módulos. Puede utilizar la reflexión para crear una instancia de un tipo de forma dinámica e incluso invocar métodos del tipo.

Los tipos definidos en el espacio de nombres System.Reflection incluyen los siguientes.

  • Montaje
  • Módulo
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Tipo
  • FieldInfo
  • EventInfo
  • PropertyInfo

Ahora profundicemos en un código para poner la reflexión en acción. Considere la siguiente clase llamada Cliente.

public class Customer

    {

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

    }

El siguiente fragmento de código muestra cómo puede obtener el nombre de la clase y el nombre del espacio de nombres de la clase Cliente mediante la reflexión:

Type type = typeof(Customer);

Console.WriteLine("Class: " + type.Name);

Console.WriteLine("Namespace: " + type.Namespace);

El siguiente fragmento de código ilustra cómo puede recuperar la lista de propiedades de la clase Customer y mostrar sus nombres en la ventana de la consola:

static void Main(string[] args)

        {

            Type type = typeof(Customer);

            PropertyInfo[] propertyInfo = type.GetProperties();

            Console.WriteLine("The list of properties of the Customer class are:--");

            foreach (PropertyInfo pInfo in propertyInfo)

            {

                Console.WriteLine(pInfo.Name);

            }

        }

El método GetProperties () de la clase Type devuelve una matriz de tipo PropertyInfo; en realidad, es una lista de las propiedades públicas de su tipo. A continuación, puede iterar esta matriz y recuperar los nombres de cada una de las propiedades públicas definidas en su tipo. Dado que la clase Cliente define tres propiedades, los nombres de todas estas tres propiedades se mostrarán en la consola cuando se ejecute este programa.

Así es como podemos mostrar los metadatos de los constructores y métodos públicos de un tipo usando la reflexión. Revisemos la clase Customer que creamos anteriormente e incorporemos dos métodos: un constructor predeterminado y un método llamado Validate que se usa para validar el objeto de cliente que se le pasa como parámetro. Así es como se vería la versión modificada de la clase Customer.

public class Customer

    {

        public Customer()

        {

            //Default constructor

        }

        public int Id

        {

            get; set;

        }

        public string FirstName

        {

            get; set;

        }

        public string LastName

        {

            get; set;

        }

        public string Address

        {

            get; set;

        }

        public bool Validate(Customer customerObj)

        {

            //Code to validate the customer object

            return true;

        }

    }

El siguiente fragmento de código se puede utilizar para mostrar los nombres de todos los constructores que pertenecen a la clase Customer. Solo tenemos un constructor en la clase Cliente; por lo tanto, solo se enumeraría uno.

Type type = typeof(Customer);           

ConstructorInfo[] constructorInfo = type.GetConstructors();

Console.WriteLine("The Customer class contains the following Constructors:--");

foreach (ConstructorInfo c in constructorInfo)

  {

     Console.WriteLine(c);

  }

Tenga en cuenta que el método GetConstructors () de la clase Type devuelve una matriz de tipo ConstructorInfo que contiene la lista de todos los constructores públicos definidos en el tipo que se refleja.

OKAY; vamos a mostrar ahora los nombres de todos los métodos públicos de la clase Cliente; de ​​nuevo, solo tenemos uno para que el nombre de un solo método se muestre en la consola cuando se ejecute el programa dado a continuación. Aquí está la lista de códigos para su referencia.

static void Main(string[] args)

 {

    Type type = typeof(Customer);

    MethodInfo[] methodInfo = type.GetMethods();

     Console.WriteLine("The methods of the Customer class are:--");

            foreach (MethodInfo temp in methodInfo)

            {

              Console.WriteLine(temp.Name);               

            }

            Console.Read();

        }

Tenga en cuenta que es posible que también se muestren los nombres de algunos métodos adicionales (ToString, Equals, GetHashCode, GetType). Estos métodos se heredan de la clase Object; cualquier clase en .Net deriva la clase Object de forma predeterminada.

También puede iterar a través de los atributos de un método. Si se han definido atributos personalizados para sus métodos, puede utilizar el método GetCustomAttributes en la instancia de la clase MethodInfo para recuperar los atributos del método. Así es como puede lograrlo.

foreach (MethodInfo temp in methodInfo)

 {

    foreach (Attribute attribute in temp.GetCustomAttributes(true))

     {

         //Write your usual code here

     }

  }

Por lo tanto, si decora sus objetos de negocio utilizando atributos en su aplicación, puede aprovechar la reflexión para reflexionar sobre el tipo, recuperar los atributos de los métodos de su tipo y luego realizar alguna acción en consecuencia.