TOC

This article has been localized into Portuguese by the community.

Reflection:

Instanciando uma classe

Até agora, trabalhamos com tipos ou objetos .NET já instanciados. Mas com o Reflection, podemos também fazer a instanciação em tempo de execução, sabendo o nome da classe que queremos instanciar. Existem várias maneiras de fazer isso, mas eu prefiro obter uma referência ao construtor que desejo usar, invocá-lo e usar o valor retornado como minha instância. Aqui está um exemplo de fazer exatamente isso. Codifique primeiro, depois explicarei tudo:

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

namespace ReflectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Type testType = typeof(TestClass);
            ConstructorInfo ctor = testType.GetConstructor(System.Type.EmptyTypes);
            if(ctor != null)
            {
                object instance = ctor.Invoke(null);
                MethodInfo methodInfo = testType.GetMethod("TestMethod");
                Console.WriteLine(methodInfo.Invoke(instance, new object[] { 10 }));
            }
            Console.ReadKey();
        }
    }

    public class TestClass
    {
        private int testValue = 42;

        public int TestMethod(int numberToAdd)
        {
            return this.testValue + numberToAdd;
        }
    }
}

Eu defini uma classe simples para testar isso, chamada TestClass. Ele simplesmente contém um campo privado e um método público. O método retorna o valor da propriedade privada, com o valor do parâmetro adicionado a ela. Agora, o que queremos é criar uma nova instância deste TestClass, chamar o TestMethod e enviar o resultado para o console.

Neste exemplo, temos o luxo de poder usar o typeof() diretamente no TestClass, mas em algum momento, você pode ter que fazer isso apenas usando o nome da classe desejada. Nesse caso, você pode obter uma referência a ele através do assembly onde ele é declarado, conforme demonstrado no capítulo sobre Type.

Portanto, com uma referência Type à classe, solicitamos o construtor padrão usando o método GetConstructor(), passando System.Type.EmptyTypes como um parâmetro. Caso quiséssemos um construtor específico, teríamos que fornecer uma matriz de Type's, cada qual definindo qual parâmetro o construtor que estávamos procurando, levaria.

Uma vez que tenhamos uma referência ao construtor, simplesmente chamamos o método Invoke() para criar uma nova instância da classe TestClass. Nós passamos null como o parâmetro para Invoke(), já que não estamos procurando especificar nenhum parâmetro. Usamos o GetMethod(), juntamente com o nome do método que queremos, para obter a função TestMethod(), e depois usamos novamente a magia do método Invoke() para chamar essa função. Desta vez, precisamos especificar um parâmetro, na forma de uma matriz de objetos. Fazemos isso em tempo real, especificando o número 10 como o único parâmetro que precisamos e, em seguida, emitimos o resultado da chamada do método. Tudo isso através da magia da Reflexão!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!