Dada esta classe
class Foo
{
// Want to find _bar with reflection
[SomeAttribute]
private string _bar;
public string BigBar
{
get { return this._bar; }
}
}
Quero encontrar o item privado _bar que vou marcar com um atributo. Isso é possível?
Eu fiz isso com propriedades em que procurei um atributo, mas nunca um campo de membro privado.
Quais são os sinalizadores de ligação que eu preciso definir para obter os campos particulares?
c#
.net
reflection
.net-attributes
David Basarab
fonte
fonte
Respostas:
Uso
BindingFlags.NonPublic
eBindingFlags.Instance
sinalizadoresfonte
Você pode fazer isso como em uma propriedade:
fonte
Obtenha o valor da variável privada usando o Reflection:
Defina o valor para a variável privada usando o Reflection:
Onde objectForFooClass é uma instância não nula para o tipo de classe Foo.
fonte
GetInstanceField(typeof(YourClass), instance, "someString") as string
Como obter o valor do campo privado em C #?Uma coisa que você precisa estar ciente ao refletir sobre membros privados é que, se seu aplicativo estiver executando em confiança média (como, por exemplo, quando você estiver executando em um ambiente de hospedagem compartilhado), ele não os encontrará - o A opção BindingFlags.NonPublic será simplesmente ignorada.
fonte
fonte
Sintaxe agradável com método de extensão
Você pode acessar qualquer campo privado de um tipo arbitrário com código como este:
Para isso, você precisa definir um método de extensão que fará o trabalho para você:
fonte
Eu uso esse método pessoalmente
fonte
Aqui estão alguns métodos de extensão para obter e definir campos e propriedades particulares simples (propriedades com o setter):
exemplo de uso:
Código:
fonte
Sim, no entanto, você precisará definir seus sinalizadores de Ligação para procurar campos privados (se estiver procurando o membro fora da instância da classe).
O sinalizador de ligação que você precisará é: System.Reflection.BindingFlags.NonPublic
fonte
Me deparei com isso enquanto procurava por isso no google, então percebo que estou encontrando um post antigo. No entanto, o GetCustomAttributes requer dois parâmetros.
O segundo parâmetro especifica se você deseja ou não pesquisar na hierarquia de herança
fonte