Primeiras aulas do curso Certificação C# Programming parte 10: Reflection

Certificação C# Programming parte 10: Reflection

Criar e aplicar atributos - Introdução

Olá, eu sou o Marcelo Oliveira. Estamos começando aqui mais um curso na Alura, o curso certificação 70-483 programação em C#. E nessa parte, na parte 10, nós vamos tratar de reflection.

Nós vamos começar aqui a ver como criar e aplicar atributos. Então os atributos eles são informações que podem ser adicionadas a uma classe ou algum outro tipo. Então, por exemplo, você tem aí uma classe e você precisa descrever dados nessa classe.

Então você vai criar propriedades, você vai criar métodos, você vai criar campos e outros tipos de membros para essa classe, mas você também pode dizer que uma classe, uma determinada classe, ela possui outros tipos de informação que são os metadados. Esses metadados, que são sobre dados, eles podem, de alguma forma, decorar, eles podem anotar uma classe. Então nós fazemos essa anotação, nós colocamos metadados em uma classe adicionando aí os atributos.

Esses atributos podem ser atributos que já vem preparados com o frame dot net ou então atributos que você mesmo vai criar. E nós vamos ensinar a utilizar dessas duas formas, utilizar os atributos preexistentes ou criando atributos que podem ser adicionados a classes, para permitir maiores informações sobre esses tipos.

E depois, nós vamos aprender a ler esses atributos. Tanto os atributos que já existem, quantos nossos atributos que foram criados de maneira customizada eles podem ser lidos pelo código. Então nós vamos aprender a utilizar o código C# para fazer a leitura desses atributos e pegar informações.

Em seguida, a gente vai aprender a utilizar reflection. Reflection que é a palavra em inglês que significa reflexão, ou seja, é o ato de se olhar no espelho ou então olhar para dentro de si mesmo. E é isso que o código faz quando ele utiliza reflection. Um código C#, ele pode ser utilizado para investigar informações do próprio código, como, por exemplo, informações sobre uma classe, os membros que compõem essa classe, quais propriedades, campos, métodos, todas essas informações que são estruturas de código podem ser investigadas através de reflection.

O próximo tópico vai tratar da geração do código em tempo de execução. Então nós vamos utilizar um bloco de códigos C# para criar outro código C#. No caso, nós vamos aprender a criar uma classe, ou melhor, o código contendo todas as declarações de classe, de campo, de método, de construtor. Nós vamos aprender a girar esse código em formato de texto num arquivo .CS, com a extensão .CS do C#. Nós vamos gerar um código a partir do nosso próprio código.

E lá no final nós vamos explorar melhor o namespace System.Reflection, que é onde estão as classes necessárias para poder investigar a estrutura de código. Então, por exemplo, informações de classe, informações de método, informações sobre propriedades, tudo isso tá dentro do namespace System.Reflection. Então é isso. Espero que vocês gostem desse curso. Muito obrigado e até logo.

Criar e aplicar atributos - Apresentação do Projeto

Olá. Estamos começando aqui a parte 10 do nosso curso de certificação C#. E a gente vai começar abrindo o projeto que acompanha esta parte 10 do curso. Como sempre, esse projeto pode ser baixado no comecinho do curso como uma atividade e você baixando esse projeto você vai extrair o código e abrir utilizando o Visual Studio.

Então nós vamos abrir aqui no Visual Studio este projeto aqui no explorador de soluções. Como nós podemos ver ele já está carregado, é o arquivo “certificação-csharp-pt10”, que é a nossa solução. Dentro dessa solução, a gente vai encontrar aqui a pasta chamada “Item01” e lá dentro o “Programa01”. E o que esse programa 01 faz? Vamos dar uma olhada.

Vamos executar com F5 e a gente vai ver um relatório sendo impresso. Que relatório é esse? É um relatório de vendas. Esse relatório de vendas está mostrando as mesmas informações, só que em dois formatos diferentes. O primeiro formato, que é este bloco aqui, é um relatório resumido de vendas. E, mais abaixo, nós temos um relatório detalhado. A gente percebe que no relatório detalhado nós temos informações como o nome da pessoa que comprou, a cidade, a região e também o país do comprador.

Então, o que nós vamos fazer agora é começar a implementar algumas modificações no nosso código para a gente poder aprender sobre reflection. Então vamos parar a aplicação. E aqui dentro da solução, nós podemos ver que existe um arquivo de dados, esse arquivo “vendas.json”. Essa extensão json define aquele formato que é a notação de objetos do javascript, essa notação ela vai definir aqui os nossos dados. Vamos abrir esse arquivo.

E aqui estão as informações referentes a cada venda, temos a pessoa que comprou, os dados pessoais e outras informações aqui. O que a gente vai ver agora é a classe que gera este relatório que é a classe chamada de relatório. Vamos abrir então “relatório.cs” e lá dentro nós encontramos aqui uma interface relatório, onde nós temos uma propriedade com o nome do relatório e também o método imprimir. E dentro da classe relatório, nós temos a implementação do código que vai gerar esse relatório.

Então nós percebemos aqui, que no construtor do relatório, nós carregamos uma variável chamada vendas, que é uma lista de vendas. Essa lista de vendas ela é obtida a partir da desserialização do objeto daquela string json, que nós vimos lá no arquivo “vendas.json”. Então para fazer essa desserialização a gente está utilizando o objeto “JsonConvert” da biblioteca “Newtonsoft.Json”, que nós já aprendemos anteriormente neste curso.

Depois que a gente desserializa o arquivo que está sendo lido, que é o “vendas.json”, a gente armazena, então, essa lista na variável de vendas. E mais para frente, quando o método imprimir é executado, nós então executamos três métodos, que são o método cabeçalho, que obviamente vai gerar o cabeçalho do relatório; depois o método com a listagem resumida; e depois a listagem detalhada.

E aqui nós temos também o programa Inicial, o programa que é o ponto de entrada da nossa aplicação. Aqui na nossa solução, no nosso projeto, nós temos aqui o “Program.cs” e aqui nós temos a declaração e a inicialização desse relatório, dessa classe relatório que eu acabei de mostrar. Que está sendo inicializada aqui com o nome relatório de vendas. E, logo a seguir, nós imprimimos chamando o método imprimir do relatório.

E, daqui para frente, a gente vai começar a implementar algumas tarefas. Nós temos aqui uma listinha de tarefas que a gente vai ter que resolver para a gente poder aprender reflection.

Criar e aplicar atributos - Diretiva Define e Atributo Conditional

Como nós podemos ver, com o programa rodando aqui, o relatório imprime tanto a sua forma resumida quanto detalhada. Mas isso não é o que nós queremos. A gente quer definir logo, durante a compilação, qual vai ser o tipo de relatório, qual vai ser o formato que vai ser impresso. Ou vai ser impresso o resumido ou o detalhado.

Então aqui nós temos a primeira tarefa que é exatamente sobre isso. Olha só a tarefa 1 é: imprimir relatório detalhado ou resumido de acordo com a compilação. Por que de acordo com a compilação? Porque nós não queremos definir esse tipo de relatório em tempo de execução, nós não queremos colocar uma instrução #if para verificar uma configuração e só então imprimir.

O que nós precisamos é trabalhar com a compilação, com diretivas de pré-compilação. E essas diretivas de pré-compilação, nós aprendemos na última parte do nosso curso e a gente vai começar a trabalhar com elas para a gente poder fazer uma pequena revisão dessas diretivas de compilação.

Então o que a gente vai fazer é abrir a classe relatório. Vamos lá na classe relatório: Relatorio.cs. E aqui nós vamos dar uma olhada no método imprimir. Olha só, nós estamos imprimindo a listagem resumida e a listagem detalhada. Então, para a gente começar a trabalhar com a pré-compilação, a gente tem primeiro que definir os símbolos de compilação.

Nós aprendemos que o símbolo de compilação ele pode ser definido aqui dentro do projeto, quando a gente entra aqui e clica no projeto, a gente pode clicar com o botão direito do mouse, ir lá para as propriedades. E aqui temos na aba Build, olha só, aba Build, nós temos aqui uma caixa de texto com os símbolos de compilação condicional.

Então o que você poderia fazer aqui para definir um símbolo que represente, por exemplo, um relatório detalhado? Você poderia incluir aqui “RELATORIO_DETALHADO”, certo?! E se fosse o relatório resumido? Você poderia colocar, trocar aqui no deste símbolo, você poderia colocar “RELATORIO_RESUMIDO”.

Porém, existe ainda uma outra maneira de definir um símbolo de compilação. E como a gente pode fazer isso? Primeiro vamos limpar essa caixa de texto, que a gente não vai usar nesta aula. A gente vai voltar agora lá para a classe relatório e lá na classe relatório, no começo dela, a gente vai colocar aqui então um símbolo de compilação, indicando um relatório resumido.

E como a gente define um símbolo de compilação? Diretamente no nosso código, a gente vai colocar uma diretiva que a gente ainda não viu, que é a diretiva “define”. A gente vai colocar aqui essa diretiva, que como toda diretiva sempre começa com o símbolo de cerquilha. Nós temos aqui então cerquilha e vamos colocar a palavra “define”. E aqui eu vou definir, então, o meu relatório resumido. “RELATORIO_RESUMIDO”.

Então com isso estou definindo que a minha aplicação, o meu programa, tem um símbolo de compilação chamado relatório resumido. Mas, pelo que a gente pode ver, existe aqui um problema de compilação, que nós estamos pegando. Porque nós não podemos utilizar esta palavra esta diretiva define depois de qualquer tipo de código.

Nós já começamos essa classe aqui com as instruções de “using”, mas a diretiva “define” ela precisa vir lá no começo, ela precisa vir antes de todo e qualquer código. Então a gente vai mover esse “#define RELATORIO_RESUMIDO” lá para cima, movendo lá para cima, para o começo do nosso código. E agora sim. Eu vou apagar essas linhas aqui do meio. Eu já apaguei. Vamos abrir aqui uma linha. Então aí está, definimos então este símbolo, que é o relatório resumido, e a gente vai começar a trabalhar com esse símbolo de compilação condicional. Muito bem.

O que nós vamos fazer agora é definir que, se esse símbolo “RELATORIO_RESUMIDO” for definido, a gente vai imprimir somente o relatório resumido e não o detalhado. Então vamos descer lá para o método imprimir onde nós temos aí a chamada para a listagem resumida e a listagem detalhada.

E o que a gente pode fazer para definir que quando o símbolo estiver definido a gente vai imprimir a listagem resumida? A gente pode simplesmente colocar aqui antes da listagem resumida uma nova diretiva. Vamos abrir uma linha aqui. Essa diretiva, como nós já aprendemos, é “#if”. Onde eu posso colocar aqui “RELATORIO_RESUMIDO”. E mais para baixo que eu posso colocar aqui então uma outra diretiva chamada de “#endif”. Então isso define aqui o final da minha compilação condicional.

E, mais para baixo, eu tenho a listagem detalhada, que não vai ser impressa quando este símbolo relatório resumido estiver definido. Então a gente vai introduzir uma nova diretiva “#if”. Então “#if RELATORIO”... E aí eu vou criar um novo símbolo, “RELATORIO_DETALHADO”. Então aí sim, nós vamos executar esta linha, ou melhor, nós vamos incluir no código compilado aqui essa instrução listagem detalhada. Vamos então fechar esse bloco de compilação condicional com a diretiva “#endif”. Muito bem.

Então, pelo que nós podemos ver aqui, somente a listagem resumida está com uma cor preto mais escuro, enquanto que a listagem detalhada está uma cor cinza, indicando que este símbolo “RELATORIO_DETALHADO” não está definido no projeto. Então, se eu rodar aqui aplicação com “F5”, a gente vai ver que ele vai imprimir somente aqui, como nós podemos ver, somente o relatório resumido. Muito bem. Vamos agora parar aplicação.

E agora no lugar de utilizar a compilação condicional, utilizando essas diretivas “#if” e “#endif”, existe também uma outra opção para agente utilizar a execução desses métodos listagem resumida e listagem detalhada. Em primeiro lugar, a gente vai comentar aqui essas diretivas que a gente criou. Então vamos colocar aqui um comentário. Vamos comentar esta linha. Vamos comentar esta linha também. Essa linha também. Então todas as diretivas aqui estão sendo arrancadas. Porque agora nós vamos fazer esse mesmo procedimento, só que de forma. Muito bem.

Nós temos então aqui a listagem resumida, que é o método que deveria ser chamado. E agora a gente vai começar a trabalhar com a outra forma, que são os atributos de compilação condicional. Então, o primeiro atributo que a gente vai definir aqui embaixo, nós temos o método que é o cabeçalho. Olha só, o método cabeçalho, como o nome indica, ele vai imprimir o título do relatório, o nome do relatório. Aí a gente vai definir que este método cabeçalho, ele só vai ser impresso se a gente definir um determinado símbolo. Então vamos colocar aqui acima deste método cabeçalho um atributo.

E como a gente define um atributo? Nós colocamos entre colchetes aqui um atributo chamado “conditional”, que já aprendemos anteriormente. Então “conditional”. Vamos resolver aqui o namespace conditional. E agora entre parênteses esse atributo exige o nome do símbolo que vai ser condicional aqui. Somente vai ser executado o método cabeçalho se eu tiver um determinado símbolo. Vamos colocar então entre aspas “RELATORIO_RESUMIDO”.

E agora nós temos mais para baixo o método listagem detalhada, que vai ser executado somente quando nós tivermos o símbolo chamado de relatório detalhado. Então vamos colocar também um atributo neste método. “Conditional”, entre parênteses: RELATORIO_DETALHADO.

E mais para baixo nós temos o método listagem resumida, que vai ser executado somente quando a gente tiver o símbolo de compilação, que é o relatório resumido. Então vamos colocar aqui o atributo “Conditional”, entre parentes: RELATORIO_RESUMIDO. Muito bem. Então nós temos todos os métodos já com seus devidos atributos. Vamos rodar agora a aplicação para ver o resultado. Rodando e está.

Nós fizemos a mesma coisa, só que utilizando atributos de compilação condicional. Agora nós vamos parar a aplicação para dar uma olhada aqui neste atributo. O que é um atributo? Temos aqui então este nome condicional e quando a gente passa o mouse por cima o IntelliSense ele reconhece aqui um tipo chamado “ConditionalAttribute”, esse aqui é o nome de uma classe e essa classe ela tem um significado especial para o .NET.

Vamos então navegar para essa classe selecionando aqui o nome “Conditional”, teclando a tecla “F12”. E com isso a gente navega para um namespace chamado “System.Diagnostics”. E lá nós temos a classe “ConditionalAttribute”. Como nós podemos ver, ela herda da classe atributo ou attribute. Vamos dar uma olhada aqui em um diagrama. Olha só, temos aqui um diagrama que mostra a nossa classe “ConditionalAttribute” e essa classe ela está herdando da classe-base que é atributo ou attribute.

Então quando nós utilizamos uma classe de atributo, quando nós adicionamos um atributo em uma classe, como, por exemplo, ou em um método, como nós fizemos aqui dentro do relatório, nesses métodos, o que nós estamos fazendo é adicionar informações sobre esses métodos. Nós estamos adicionando dados sobre dados, ou seja, nós estamos criando metadados. E esses metadados eles são importantes para que vários processos dentro de uma aplicação para que eles descubram informações sobre membros, sobre métodos, sobre classe, sobre interfaces, sobre o código em si.

Então, por exemplo, o compilador ele investiga que o seu código e ele descobre que existem esses atributos condicionais. Então, com isso, ele consegue definir se ele vai executar ou não os atributos, ou melhor, os métodos que estão sendo chamados aqui dentro do método imprimir. Então, quando o método do imprimir é executado, a gente pode perceber aqui pelo resultado do nosso relatório, que alguns métodos estão ficando de fora, apesar da chamada aqui para a listagem detalhada estar sendo definida, essa chamada na verdade não vai acontecer, porque o atributo conditional ele está ignorando por causa da falta desse símbolo de compilação do relatório detalhado.

Então, se nós trocarmos agora o símbolo de compilação lá em cima na classe relatório, vamos comentar aqui esta linha “#define RELATORIO_RESUMIDO” e vamos adicionar um novo “#define”, para a gente definir o outro símbolo que é “RELATORIO_DETALHADO” e vamos rodar a aplicação. Com isso nós vemos que agora está sendo exibido o outro formato de relatório, que é o detalhado, porém nós não estamos vendo aqui o cabeçalho. Por que a gente não consegue ver o cabeçalho? Porque o método cabeçalho ele está definido somente para o símbolo relatório resumido. Olha só. Como é que eu faço então para eu imprimir também com o relatório detalhado. Eu posso acumular atributos aqui neste método cabeçalho.

Como que eu faço isso? Eu posso colocar aqui vírgula, vou quebrar uma linha e vou colocar “conditional”, novamente, só que dessa vez eu vou colocar outro símbolo que é “RELATORIO_DETALHADO” e vou rodar a aplicação. E, agora sim, nós podemos ver o relatório de vendas com o seu cabeçalho devidamente impresso aqui no console.

Sobre o curso Certificação C# Programming parte 10: Reflection

O curso Certificação C# Programming parte 10: Reflection possui 195 minutos de vídeos, em um total de 35 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

  • 1120 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1120 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1120 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1120 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?
Acesso por 1 ano
Estude 24h/dia onde e quando quiser
Novos cursos toda semana