Implementando Observer em C# com Dependency Injection
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!)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!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🔗
2. Para🔄 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!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!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!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!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!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!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!)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!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:
- Acessar metadados
📜 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. de tipos (classes, structs, etc.).
- Ver seus membros (propriedades
⚡ 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., métodos e eventos).
- Instanciar objetos dinamicamente.
- Invocar métodos
🧠 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.
Dentro desse namespace, encontramos classes🏗️ 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!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!)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)!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:
Type.GetProperties()
: retorna um array de propriedades⚡ 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 tipo.
Type.GetMethods()
: obtém os métodos🧠 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. do tipo.
Type.GetConstructors()
: fornece os construtores🔑 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. públicos.
MethodInfo.Invoke()
: invoca um método🧠 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.
Activator.CreateInstance()
: cria instâncias de um tipo🧠 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. sem chamá-lo diretamente no código.
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!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!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)!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}");
}
}
}
pedido.GetType()
: obtém o tipo🧠 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. em tempo de execução.
GetProperties()
: retorna todas as propriedades⚡ 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. públicas.
prop.GetValue(pedido)
: lê o valor daquela propriedade⚡ 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. no objeto
pedido
.
No console, você veria algo como:
Propriedade⚡ 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!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!)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!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!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!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!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!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!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)!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!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!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!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!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
// 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🔗
- Performance
🔄 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!: Reflection não é das operações mais leves. Invocações dinâmicas geralmente são mais lentas do que chamadas diretas. Se precisar de alto desempenho
⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!Descubra como medir, diagnosticar e otimizar performance em aplicações .NET com dicas práticas e ferramentas essenciais para devs., use Reflection com moderação.
- Acesso a Membros Privados: Em alguns casos, você pode burlar o encapsulamento
🔒 Encapsulamento: Proteja Seus Dados como um Banco Suíço!Aprenda a proteger seus dados com encapsulamento em C#: técnicas e melhores práticas para um código seguro, modular e eficiente. e acessar membros privados, o que pode quebrar a segurança e a lógica do sistema. Use esse “poder” com muito cuidado.
- Disponibilidade de Tipos: Ao usar string
📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance. para carregar tipos (como em
Type.GetType("Foo.Bar")
), você depende da presença exata desses tipos em tempo de execução. Se não estiverem disponíveis, seu código quebra.
Desafio Prático🔗
Crie um Validador Dinâmico🎭 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)!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
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)!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!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!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!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!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🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/