Aprenda a utilizar Reflection em C# para inspecionar tipos

Se você já se perguntou como inspecionar as informações de um tipo🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. diretamente em tempo de execução, Reflection em C# é a resposta. É quase como abrir a “caixa-preta” de uma classe ou de um método para ver quais membros estão lá, quais parâmetros um método aceita e até mesmo invocar métodos sem precisar fazer chamadas “normais” no código. Tudo isso sem conhecer o tipo em tempo de compilação. Neste artigo, vamos explorar como a Reflection funciona, como utilizá-la em cenários práticos do dia a dia e também entender por que tomar cuidado com sua performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos!.

Tabela de Conteúdo🔗

1. O que é Reflection?

2. Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! Que Serve Reflection?

3. Como Funciona: O Namespace System.Reflection

4. Principais Operações com Reflection

5. Exemplo Prático📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável.: Inspeção de Propriedades

6. Criando Instâncias em Tempo de Execução

7. Chamando Métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. Dinamicamente

8. Cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Reais de Uso

9. Cuidados com Performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos! e Segurança

10. Desafio Prático

O que é Reflection?🔗

Reflection é a capacidade de um programa examinar (e até modificar) a sua própria estrutura em tempo de execução. Em C#, isso significa que você pode descobrir as propriedades, métodos, construtores🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!Descubra como os construtores em C# estruturam objetos, garantindo inicialização segura e promovendo boas práticas de desenvolvimento orientado a objetos., campos e eventos de um tipo enquanto o programa está rodando.

Imagine ter uma ferramenta que permite abrir um objeto e enxergar tudo o que há dentro dele - até mesmo os métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. privados se você realmente quiser. Isso é Reflection.

Para Que Serve Reflection?🔗

Reflection permite:

Descobrir metadados de tipos (classes, structs) ✅ Manipular objetos sem conhecer seu tipo em tempo de compilação ✅ Criar sistemas dinâmicos (plugins, ORMs, injetores de dependência)

Caso do Mundo Real:

Sistemas de plugins (como o Photoshop) usam Reflection para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! carregar funcionalidades externas sem recompilar o código principal.

Como Funciona: O Namespace System.Reflection🔗

C# oferece o namespace System.Reflection com classes e métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. que possibilitam:

Dentro desse namespace, encontramos classes🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. como TypeInfo, PropertyInfo, MethodInfo e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. ConstructorInfo, que contêm as informações detalhadas para explorar a estrutura de um tipo🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código..

Principais Operações com Reflection🔗

Alguns dos métodos e propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. mais relevantes ao trabalhar com Reflection:

Essas operações permitem analisar e manipular objetos conforme a necessidade, seja para criar plugins extensíveis, gerar documentação automática📄 Swagger/OpenAPI: Documente sua API Automaticamente!📄 Swagger/OpenAPI: Documente sua API Automaticamente!Descubra como gerar documentação interativa e automatizada em APIs com o Swagger/OpenAPI. Aprenda a configurar no .NET e testar endpoints facilmente. ou até serializar dados de forma personalizada (embora serialização⚡ System.Text.Json 2.0: Serialização com Source Generators!⚡ System.Text.Json 2.0: Serialização com Source Generators!Descubra como os Source Generators do .NET 8 revolucionam a serialização JSON, proporcionando performance 5x mais rápida e menor uso de memória. seja um assunto à parte).

Exemplo Prático: Inspeção de Propriedades🔗

Considere que você tem uma classe simples de “Pedido” e deseja ler o nome das propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. e seus valores. Você pode fazer algo assim:

using System;
using System.Reflection;
public class Pedido
{
    public int Id { get; set; }
    public string Cliente { get; set; }
    public decimal ValorTotal { get; set; }
}
class Program
{
    static void Main()
    {
        Pedido pedido = new Pedido
        {
            Id = 123,
            Cliente = "Maria",
            ValorTotal = 549.90m
        };
        Type tipoPedido = pedido.GetType();
        PropertyInfo[] propriedades = tipoPedido.GetProperties();
        foreach (var prop in propriedades)
        {
            var valor = prop.GetValue(pedido);
            Console.WriteLine($"Propriedade: {prop.Name}, Valor: {valor}");
        }
    }
}

No console, você veria algo como:

Propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção.: Id, Valor: 123

Propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção.: Cliente, Valor: Maria

Propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção.: ValorTotal, Valor: 549.90

Criando Instâncias em Tempo de Execução🔗

E se você quiser “descobrir” um tipo só pelo nome e criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. uma instância dele sem usar new explicitamente? Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! isso, usamos o Activator.CreateInstance():

string nomeCompletoDaClasse = "MeuApp.Models.Pedido";
Type tipoDinamico = Type.GetType(nomeCompletoDaClasse);
// Se o tipo existe, criamos um objeto desse tipo!
if (tipoDinamico != null)
{
    object instancia = Activator.CreateInstance(tipoDinamico);
    Console.WriteLine($"Objeto criado dinamicamente: {instancia.GetType().Name}");
}
else
{
    Console.WriteLine("Tipo não encontrado!");
}

Esse recurso📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. é muito comum ao desenvolver sistemas de plugin ou extensões, onde🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. os componentes podem ser carregados em tempo de execução, sem precisar editar o código principal.

Chamando Métodos Dinamicamente🔗

Para chamar métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. sem referência estática, você obtém o MethodInfo e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. usa Invoke. Por exemplo:

public class ServicoEmail
{
    public void EnviarEmail(string destinatario, string mensagem)
    {
        Console.WriteLine($"Enviando e-mail para {destinatario} com a mensagem: {mensagem}");
    }
}
class Program
{
    static void Main()
    {
        Type tipo = typeof(ServicoEmail);
        object servicoEmail = Activator.CreateInstance(tipo);
        MethodInfo metodoEnviar = tipo.GetMethod("EnviarEmail");
        metodoEnviar.Invoke(servicoEmail, new object[] { "[email protected]", "Olá João!" });
    }
}

Você nem precisou escrever servicoEmail.EnviarEmail(…); a chamada aconteceu via Reflection. Essa técnica é útil para criar configurações dinâmicas ou para automatizar testes sem precisar criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. dependências explícitas em tempo de compilação.

Cenários Reais de Uso🔗

1. ORM (Entity Framework🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.): Mapeia colunas do banco para propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. de classes

2. Injeção de Dependência🎮 Projeto: Sistema de Notificações com Observer e DI!🎮 Projeto: Sistema de Notificações com Observer e DI!Descubra como sincronizar notificações em um sistema de delivery com o padrão Observer e Dependency Injection em C#. Obtenha código limpo, modular e escalável.: Identifica construtores🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!Descubra como os construtores em C# estruturam objetos, garantindo inicialização segura e promovendo boas práticas de desenvolvimento orientado a objetos. e parâmetros automaticamente

3. Serialização JSON⚡ System.Text.Json 2.0: Serialização com Source Generators!⚡ System.Text.Json 2.0: Serialização com Source Generators!Descubra como os Source Generators do .NET 8 revolucionam a serialização JSON, proporcionando performance 5x mais rápida e menor uso de memória./XML: Converte objetos em formatos de dados

4. Sistemas de Plugins: Carrega DLLs e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. descobre funcionalidades

Exemplo de API🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.:

// Framework hipotético que descobre controllers automaticamente
public void MapearRota(string url, string controller, string metodo) {
    Type tipoController = Assembly.GetExecutingAssembly().GetType(controller);
    object instancia = Activator.CreateInstance(tipoController);
    MethodInfo acao = tipoController.GetMethod(metodo);
    acao.Invoke(instancia, null);
}

Cuidados com Performance e Segurança🔗

Desafio Prático🔗

Crie um Validador Dinâmico🎭 Dynamic Types: Flexibilidade com `dynamic`!🎭 Dynamic Types: Flexibilidade com `dynamic`!Descubra como utilizar o tipo dynamic no C# para flexibilizar o código, conhecendo suas vantagens, riscos e aplicações práticas em tempo de execução. que:

1. Recebe qualquer objeto

2. Usa Reflection para verificar se todas propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. marcadas com [Obrigatorio] estão preenchidas

3. Retorna lista📦 List<T>: Dinamismo além dos Arrays!📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. de erros

Dica: Crie um atributo customizado📜 Atributos Customizados: Metadados que Guiam seu Código!📜 Atributos Customizados: Metadados que Guiam seu Código!Descubra como atributos customizados potencializam a organização do código, facilitam auditorias e testes, e garantem eficiência.:

public class ObrigatorioAttribute : Attribute { }

Solução Passo a Passo:

1. Itere sobre todas propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. do objeto

2. Verifique quais têm o atributo📜 Atributos Customizados: Metadados que Guiam seu Código!📜 Atributos Customizados: Metadados que Guiam seu Código!Descubra como atributos customizados potencializam a organização do código, facilitam auditorias e testes, e garantem eficiência. [Obrigatorio]

3. Valide se o valor🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. não é nulo/vazio

4. Colete os resultados

Reflection é uma faca de dois gumes: poderosa, mas📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. custosa. Use em sistemas que realmente precisam de flexibilidade extrema, e sempre considere alternativas como genéricos ou delegates para melhor performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos!!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados