Pergunta

Eu reflexão usado muitas vezes antes de métodos públicos, mas eu nunca percebi que métodos privados podem ser chamados também. Veja reflexão com membros privados .

Por que é que permitiu, em primeiro lugar? Não é que vai quebrar a regra de "privado" ser "privado"?

Foi útil?

Solução

private em C # é realmente apenas uma parte da especificação da linguagem; na linguagem C #, bem como na linguagem Visual Basic ou qualquer outra linguagem .NET sensível (incluindo CIL , o que todas as linguagens .NET compilar a) um é impedido de acessar um private (ou protected, se você não estiver dentro de um membro classe derivada) na linguagem . Entretanto, apenas porque a linguagem não apoiar publicamente acessando private ou protected membros não significa a estrutura subjacente não pode dar acesso a esses membros.

Este é um daqueles casos em que um tipicamente não deve estar usando soluções como reflexão para acessar ou modificar private ou protected membros, mas o quadro permite qualquer maneira. Geralmente, você deve ter um muito boa razão para private de acesso ou protected membros; Um desses motivos, por exemplo, está a implementar um serializador que precisa de olhar para o estado interno do objeto para adequadamente serialize o objeto. Se você não está fazendo algo como isso, você deve realmente olhar para reimplementar a classe que você está cutucando em torno de dentro, de modo que você não precisa usar a reflexão no seu programa.

Outras dicas

Isso só é permitido quando o código está sendo executado em confiança total (ou com a permissão relevante). Caso contrário, um MethodAccessException será lançada.

O quadro é perfeitamente capaz de restringir o acesso de forma adequada - ele simplesmente não fazê-lo quando você está correndo sob confiança total ou quando você tem permissões específicas. Consulte "Considerações de segurança para reflexão" para mais detalhes de quando você' é capaz de fazer isso.

Sim, ele faz quebrar a regra. Eu quase nunca passar o código durante uma revisão se alguém fez isso.

Usando reflexão para chamar um método é slllloooow, não digite-safe, e quebra com facilidade se a classe subjacente tem os métodos privados reformulado.

Assim, em breve, eu concordo, que é uma má ideia!

Este é o poder avançado você começa a partir do quadro. É muito incomum para usá-lo no código de produção para invocar métodos, ele quebra as vantagens de membros esconderijo.

Há alguns lugares onde pode ser útil:

  • Legado teste de código - Por exemplo, suponha que você está trabalhando com código legado e que pretende cobrir com testes de unidade. Se você não está autorizado a alterar o código e quiser testar pequena parte da funcionalidade invocar métodos privados é útil.
  • Hacks em código de produção - eu encontrei uma vez um bug no controle de 3rd party onde em algum cenário uma limpeza privada não foi feito. Usando privada invoke eu poderia trabalhar em torno dele.

Não há nada errado com o quadro fornecendo essa funcionalidade, mas usá-lo onde não é uma obrigação é errado.

A reflexão é uma poderosa funcionalidade em .NET, mas tem também as suas desvantagens.

Pros:

  1. permite a reflexão para acessar todos os membros (incluindo o privado e protegido), desde que você tenha pelo menos o ReflectionPermission segurança. (Esta permissão pode ser adquirida quando o aplicativo acessa a refletida montagem da mesma unidade, não a partir da Internet.)

  2. Em alguns casos raros, a reflexão é a única maneira de executar uma tarefa.

Contras:

  1. breaks Reflexão de segurança (como não Decompiling uma assembléia). Para obter segurança completa sobre o código e os dados do seu aplicativo, você deve usar criptografia, não apenas contar com as palavras-chave privada ou protegida porque, se sozinho, pode ser facilmente quebrado por meio de reflexão ou descompilação.

  2. A reflexão é muito mais lento e consome mais recursos do que referência estática (o modo normal, você chamar métodos). Por esta razão, você deve evitar a reflexão, a menos que esta é a única maneira de resolver o seu problema.

Exemplos de quando reflexão é a única maneira de resolver o problema a seguir:

  1. Suponha que seu aplicativo compila dinamicamente código (como quando você está funções que o usuário fornecer em tempo de execução plotagem). Nesses casos, a única maneira de carregar os conjuntos e tipos é através da reflexão.

  2. Você deseja clonar um objeto. Você precisaria usar a reflexão para acessar seus campos particulares.

Espero que isso ajude. Gostaria de agradecer aqui o Sr. Francesco Balena em seu belo livro, Programação Microsoft Visual Basic 2005:. A Linguagem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top