This article has been localized into Portuguese by the community.
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!