Latest web development tutorials

C # reflexão (reflexão)

meios de reflexão pode acessar o programa, a sua capacidade de detectar e modificar seu próprio estado ou comportamento.

Montagem contém o módulo que contém tipos, que por sua vez contém membros. Reflexão fornece um pacote de objeto montagens, módulos e tipos.

Você pode usar o reflexo para criar dinamicamente uma instância do tipo, o tipo está ligado a um objeto existente, ou obter o tipo de um objeto existente. Você pode então chamar o tipo de abordagem ou acessar seus campos e propriedades.

Prós e contras

vantagens:

  • 1, reflectindo uma melhor flexibilidade e escalabilidade processo.
  • 2, reduzir o acoplamento, aumentar a capacidade de adaptação.
  • 3, o que permite que o programa para criar e controlar qualquer tipo de objecto, sem classe de destino codificados antes.

desvantagens:

  • 1, os problemas de desempenho: utilização é essencialmente uma reflexão explicar o funcionamento, quando os campos e métodos de acesso a muito mais lento do que o código directa. Assim reflexão sobre a principal flexibilidade de aplicação e um quadro escalabilidade exigente, o procedimento geral não é recomendada.
  • 2, o uso de reflexos difusos dentro da lógica do programa; programadores querem ver a lógica no código-fonte, mas a reflexão evitarão a tecnologia de código-fonte, o que trará problemas de manutenção, e código de reflexão mais complexa do que o código correspondente diretamente .

Reflex (reflexão) usos

Reflex (Reflexo) para os seguintes fins:

  • Ele permite que você visualizar as propriedades em tempo de execução (atributo) informações.
  • Ele permite analisar a recolha de vários tipos, bem como exemplos destes tipos.
  • Ele permite que a ligação tardia de métodos e propriedades (propriedade).
  • Ele permite a criação de um novo tipo em tempo de execução e, em seguida, usando esses tipos executar algumas tarefas.

Ver metadados

Nós já mencionamos na seção acima, o uso de reflexão (reflexão) pode visualizar as propriedades (atributo) informações.

Objeto de classeSystem.Reflection MemberInfoprecisa ser inicializado, para descobrir as propriedades associadas com a classe (atributo). Para fazer isso, você pode definir uma classe de objeto-alvo, como segue:

System.Reflection.MemberInfo info = typeof (MyClass);

O programa a seguir demonstra este ponto:

using System;

[AttributeUsage (AttributeTargets.All)]
HelpAttribute classe pública: System.Attribute
{
   Url cadeia somente leitura pública;

   Cadeia pública Tópico // Topic é uma nomeados (nomeados) parâmetros {
      obter
      {
         retornar tema;
      }
      conjunto
      {

         topic = valor;
      }
   }

   pública HelpAttribute (string url) // url é um parâmetro de posicionamento (posicional) {
      this.Url = url;
   }

   tópico cadeia privada;
}
[HelpAttribute ( "Informações sobre a classe MyClass")]
class MyClass
{
}

AttributeAppl namespace
{
   Programa de classe
   {
      static void Main (string [] args)
      {
         System.Reflection.MemberInfo info = typeof (MyClass);
         Object [] atributos = info.GetCustomAttributes (true);
         for (int i = 0; i <attributes.Length; i ++)
         {
            System.Console.WriteLine (atributos [i]);
         }
         Console.ReadKey ();

      }
   }
}

Quando o código acima é compilado e executado, ele irá mostrar as propriedades personalizadas ligados a uma classeMyClassem:

HelpAttribute

Exemplos

Neste exemplo, usaremosDebugInfopropriedade criado no último capítulo, e usa reflexão (reflexão) para ler os metadados classeRectangle.

using System;
using System.Reflection;
namespace BugFixApplication
{
   // BugFix uma propriedade personalizada é atribuído à classe e seus membros [AttributeUsage (AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = true)]

   DebugInfo classe pública: System.Attribute
   {
      Bugno int privado;
      desenvolvedor cadeia privada;
      lastReview cadeia privada;
      string mensagem pública;

      pública DebugInfo (bg int, dev fio, fio d)
      {
         this.bugNo = bg;
         this.developer = dev;
         this.lastReview = d;
      }

      Bugno int pública
      {
         obter
         {
            voltar Bugno;
         }
      }
      Desenvolvedor cadeia pública
      {
         obter
         {
            voltar desenvolvedor;
         }
      }
      Cadeia pública LastReview
      {
         obter
         {
            voltar lastReview;
         }
      }
      Mensagem cadeia pública
      {
         obter
         {
            retornar mensagem;
         }
         conjunto
         {
            mensagem = value;
         }
      }
   }
   [DebugInfo (45, "Zara Ali", "2012/12/08",
	Message = "incompatibilidade de tipo Return")]
   [DebugInfo (49, "Nuha Ali", "2012/10/10",
	Message = "variável não utilizada")]
   classe Retângulo
   {
      // Variáveis ​​membro protegido comprimento duplo;
      protegidas largura dupla;
      Retângulo pública (duplo l, dupla w)
      {
         comprimento = L;
         largura W =;
      }
      [DebugInfo (55, "Zara Ali", "19/10/2012",
	   Message = "incompatibilidade de tipo Return")]
      GetArea public double ()
      {
         retornar comprimento * largura;
      }
      [DebugInfo (56, "Zara Ali", "19/10/2012")]
      Exibição public void ()
      {
         Console.WriteLine ( "Duração: {0}", comprimento);
         Console.WriteLine ( "Largura: {0}", largura);
         Console.WriteLine ( "Área: {0}", GetArea ());
      }
   } // Retângulo classe End  
   
   classe ExecuteRectangle
   {
      static void Main (string [] args)
      {
         Retângulo r = new Rectangle (4.5, 7.5);
         r.Display ();
         Tipo Type = typeof (retângulo);
         // Traverse classe Retângulo atributos foreach (atributos do objeto em type.GetCustomAttributes (false))
         {
            DebugInfo dbi = (DebugInfo) atributos;
            se (null! = dbi)
            {
               Console.WriteLine ( "Bug não: {0}", dbi.BugNo);
               Console.WriteLine ( "Revelador: {0}", dbi.Developer);
               Console.WriteLine ( "Última avaliação: {0}",
					dbi.LastReview);
               Console.WriteLine ( "Observações: {0}", dbi.Message);
            }
         }
         
         // Método Iterate atributos foreach (MethodInfo m em type.GetMethods ())
         {
            foreach (Atributo um em m.GetCustomAttributes (true))
            {
               DebugInfo dbi = (DebugInfo) a;
               se (null! = dbi)
               {
                  Console.WriteLine ( "Bug não: {0}, por Método: {1}",
						dbi.BugNo, m.Name);
                  Console.WriteLine ( "Revelador: {0}", dbi.Developer);
                  Console.WriteLine ( "Última avaliação: {0}",
						dbi.LastReview);
                  Console.WriteLine ( "Observações: {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine ();
      }
   }
}

Quando o código acima é compilado e executado, ele produz os seguintes resultados:

Comprimento: 4,5
Largura: 7,5
Área: 33.75
Bug No: 49
Desenvolvedor: Nuha Ali
Última avaliação: 2012/10/10
Observações: variável não utilizada
Bug No: 45
Desenvolvedor: Zara Ali
Última avaliação: 2012/12/08
Observações: Tipo de retorno incompatibilidade
Bug No: 55, para o Método: GetArea
Desenvolvedor: Zara Ali
Última avaliação: 19/10/2012
Observações: Tipo de retorno incompatibilidade
Bug No: 56, para o Método: Exibição
Desenvolvedor: Zara Ali
Última avaliação: 19/10/2012
Observações: