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: