C# Reflexão

C# Reflexão
Como o nome sugere, a reflexão é algo que fornece uma imagem de informação sobre algo. Dentro de C#, uma reflexão é um espaço de nome bem conhecido encontrado na biblioteca de "sistema" para ver metadados sobre as classes, métodos, parâmetros ou tipos. Ele contém muitas classes e atributos para obter informações diferentes sobre os aspectos do código. Então, decidimos realizar alguns exemplos muito simples para elaborar o uso de namespace de reflexão junto com seus atributos. Vamos começar com a criação de arquivos C#.

Exemplo # 01:

Introdução ao primeiro exemplo, estaremos analisando a elaboração do uso do “sistema.Classe de reflexão ”para encontrar informações de metadados sobre diferentes tipos, métodos ou campos. Então, iniciamos esse código com o uso da biblioteca do sistema e, depois disso, utilizamos o “sistema.Classe de reflexão ”no código. Iniciamos um teste de namespace e um teste de aula dentro dele.

Este teste de classe contém uma única função, "main ()", que será nossa função de driver para este código. A função Main () foi iniciada com a palavra -chave "Tipo", carregando um tipo "T1" de uma string através da função "typeof ()" da classe do sistema. O "tipo" surgiu da aula de reflexão. Agora, o mesmo procedimento foi usado para carregar o tipo de T2 e T3 de um número inteiro e caráter, respectivamente. Como sabemos que a aula de reflexão criou muitos dos atributos de metadados para descobrir as informações sobre tipos, métodos e campos.

Então, usaremos esses atributos de metadados aqui para encontrar informações sobre os tipos T1, T2 e T3. Assim, usamos três console.Declarações de função writeLine () para exibir o nome, nome completo, espaço para nome e baseType do tipo T1, T2 e T3 separadamente. Para isso, estamos utilizando o "nome", "Nome FullName", "namespace" e "BaseType" atributos de uma classe de reflexão aqui no código.

Temos compilado este recém -feito “reflexo.Arquivo CS ”com o compilador C#“ MCS ”já embutido em nosso sistema Linux. O arquivo "exe" para este código foi gerado e o usamos para executar o código compilado com o comando de tempo de execução "mono". A saída exibida em nossa tela mostra o nome, nome de nome, names fullname, namespace e baseType para a sequência de tipos carregados, número inteiro e caractere.

Exemplo # 02:

Em nosso primeiro exemplo, obtemos informações sobre o tipo em metadados C# usando os atributos da classe de reflexão. Usaremos a classe de reflexão para obter informações de metadados sobre a “montagem carregada.”Então, temos iniciado nosso exemplo com o uso da biblioteca“ System ”na primeira linha e usando o“ sistema.Classe de reflexão ”na segunda linha.

Este código contém um teste de namespace com o mesmo nome de classe de classe. Neste teste de aula, usamos a função de driver principal () para começar a executar nosso sistema. Dentro da função Main (), a execução começa com o carregamento de uma montagem “T.”Esta variável de montagem carregada“ T ”estará obtendo as informações de metadados sobre a montagem“ int ”de C# através da função“ TypeOf ”usando“ INT ”dentro dela, seguido pela palavra -chave DOT e“ Assembléia ”. A próxima linha exata tem o console.Função writeLine () para exibir as informações de metadados sobre a montagem “t.”A classe e o namespace são concluídos aqui e o código é salvo para uso.

Compilamos esse código C# recém -fabricado com o compilador "MCS" e depois o executamos com o executor de tempo de execução "mono" para C# no Ubuntu 20.04. Ele exibiu o nome de uma biblioteca para a Assembléia "T" como "Mscorlib", sua versão, cultura e token de chave pública em nossa tela abaixo.

Exemplo # 03:

Em nosso último exemplo, examinaremos as informações de metadados para todas as classes, métodos, atributos ou parâmetros usados ​​no código através da classe de reflexão. Então, estamos iniciando esse código com o mesmo padrão de código que usamos nos dois exemplos acima, eu.e., o uso da biblioteca do sistema e o “sistema.Reflexão ”Classe. Um espaço para nome "novo" foi criado que possui duas classes, eu.e., Informação e teste.

Vamos discutir a classe "info" primeiro. Nesta classe, estamos usando a definição das propriedades ou variáveis ​​que temos que usar neste código, i.e., Idade do tipo int e nome do tipo de string. Os atributos "Get" e "Set" são utilizados para obter o valor para ambos os valores e atribuí -los às variáveis ​​idade e nome, respectivamente. Aqui estão duas funções de construtor nas informações da classe. O primeiro construtor não possui parâmetros, enquanto o outro é um construtor parametrizado que obtém valores em novas variáveis ​​“a” e “n.”O construtor simples inicializa os valores de idade e nome variável para 25 e“ vazios ”, respectivamente.

Por outro lado, o outro construtor tem atribuído valores de variáveis ​​aleatórias para envelhecer e nome.e., vazio. A função "show ()" definida pelo usuário foi usada aqui para exibir os valores da variável 'Age' e 'Name' no console do Ubuntu 20.04 Usando a função WriteLine () da classe de console da biblioteca do sistema. A primeira aula foi concluída aqui.

Vamos discutir a classe de "teste", onde estamos utilizando os atributos de "reflexão" para obter informações de metadados sobre o código. Portanto, ele contém um método main () que é nosso executor para este código. Carregamos um objeto para a montagem da classe “ASB” para obter a Assembléia atualmente executando com a função 'getExecutingassesslembly'. Este objeto "ASB" foi usado para chamar a função "getTypes ()" para armazenar as informações do tipo de montagem dentro da matriz de tipos “t.”

Agora, é hora de iterar cada tipo da montagem e obter informações sobre seus metadados. Então, dentro do primeiro loop "foreach", estamos iterando o tipo usado no código por meio da matriz de tipo "T", I I.e., Aulas. O nome do total de classes utilizadas será exibido pelo atributo "nome" da classe de reflexão. Uma matriz “Met” do tipo MethodInfo foi inicializada para obter métodos totais na classe específica usando o iterador “I.”Um loop interno“ foreach ”é usado para exibir o nome de cada método dentro da classe específica por meio do atributo de nome.

A matriz do tipo ParameterInfo "par" é definida para obter as informações dos parâmetros para todos os métodos da classe específica usando a função "getParameter ()". O último loop interno é usado para iterar todos os parâmetros “P” encontrados na matriz “par” para exibir o nome do parâmetro e o parameterType no shell usando o nome e o atributo ParameterType da classe de reflexão. Nosso código agora está completo e pronto para compilação.

As informações de metadados sobre "informações" e classes "testes" são exibidas separadamente. As classes possuem métodos de tipo de parâmetro int; Métodos de tipo de string; e métodos de tipo de objeto

Conclusão:

É assim que uma classe de namespace de reflexão pode ser utilizada para obter informações sobre metadados sobre métodos, tipos, parâmetros, montagens e classes. Dentro de nossos dois primeiros exemplos, discutimos o uso de nome, nome completo, namespace, atributo BaseType da classe de reflexão para obter informações sobre os tipos e montagem carregados, i i.e., int, char, string. No último exemplo, usamos os getTypes, getMethods (), getParameters e o nome do nome e do parâmetro do atributo da classe de reflexão para obter metadados sobre todo o código.