Um dos maiores benefícios do .NET Framework e do Common Language Run-Time(CLR) em particular é a riqueza dos tipos de informações em runtime. O System.Reflection permite que você navegue e analise um tipo de dados em tempo de execução. Esta capacidade permite desenvolver sistemas mais dinâmicos e que possuam uma arquitetura modular mais clara.
Entre diversas outras funcionalidades, o Reflection nos pertime encapsular os assemblies. Com isso você pode utilizar o Reflection para acessar um assembly que não esteja diretamente referenciado em seu projeto, podendo obviamente, utilizar suas classes e métodos.
O uso mais comum, útil e prático de Reflection é a chamada de métodos dinâmicos, de um assembly externo ou não.
Veja no exemplo abaixo um código que usa Reflection para carregar a classe HttpUtility do assembly System.Web e usar os métodos HtmlEncode e HtmlDecode em um texto HTML:
'Código em VB.NET: Imports System.Reflection Public Class Program Public Overloads Shared Sub Main() Dim path As String = "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll" 'Instancia o Assembly através do arquivo Dim webAssemby As Assembly = Assembly.LoadFile(path) 'Recebe o tipo de objeto da classe HttpUtility Dim utilType As Type = webAssemby.GetType("System.Web.HttpUtility") 'Recebe os método estáticos HtmlEncode e HtmlDecode Dim encode As MethodInfo = utilType.GetMethod("HtmlEncode", _ New Type() {GetType(System.String)}) Dim decode As MethodInfo = utilType.GetMethod("HtmlDecode", _ New Type() {GetType(System.String)}) 'Cria uma string para codificar Dim originalString As String = "Isto é um exemplo do uso de Reflection <.>" Console.WriteLine(originalString) 'Codificae mostra o valor codificado Dim encoded As String = CType(encode.Invoke(Nothing, New Object() {originalString}), String) Console.WriteLine(encoded) 'Decodifica para comparar se funcionou corretamente Dim decoded As String = CType(decode.Invoke(Nothing, New Object() {encoded}), String) Console.WriteLine(decoded) End Sub End Class
//Código em C#: using System; using System.Reflection; namespace ReflectionCSharp { class Program { static void Main(string[] args) { String path = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll"; //Instancia o Assembly atrav‚s do arquivo Assembly webAssemby = Assembly.LoadFile(path); //Recebe o tipo de objeto da classe HttpUtility Type utilType = webAssemby.GetType("System.Web.HttpUtility"); //Recebe os m‚todo est ticos HtmlEncode e HtmlDecode MethodInfo encode = utilType.GetMethod("HtmlEncode", new Type[] {typeof(System.String)}); MethodInfo decode = utilType.GetMethod("HtmlDecode", new Type[] {typeof(System.String)}); //Cria uma string para codificar String originalString = "Isto ‚ um exemplo do uso de Reflection <.>"; Console.WriteLine(originalString); //Codifica e mostra o valor codificado String encoded = (String)encode.Invoke(null, new Object[] {originalString}); Console.WriteLine(encoded); //Decodifica para comparar se funcionou corretamente String decoded = (String)decode.Invoke(null, new Object[] {encoded}); Console.WriteLine(decoded); } } }É claro que o Reflection não faz apenas isso, possúi vários recursos interessantes, que vale a pena serem explorados. Mas uma coisa é inegável, as chamadas dinâmicas feitas com o Reflection tornam a lógica da sua aplicação bem mais flexíveis. Até a próxima...