Como o título diz: A reflexão pode fornecer o nome do método atualmente em execução.
Estou inclinado a adivinhar que não, por causa do problema de Heisenberg. Como você chama um método que informa o método atual sem alterar qual é o método atual? Mas espero que alguém possa me provar que estou errado lá.
Atualizar:
- Parte 2: isso também poderia ser usado para procurar dentro de código uma propriedade?
- Parte 3: Como seria o desempenho?
Resultado final
Aprendi sobre MethodBase.GetCurrentMethod (). Aprendi também que não apenas posso criar um rastreamento de pilha, como também posso criar apenas o quadro exato de que preciso, se quiser.
Para usar isso dentro de uma propriedade, basta usar um .Substring (4) para remover o 'set_' ou 'get_'.
.net
reflection
Joel Coehoorn
fonte
fonte
Respostas:
A partir do .NET 4.5, você também pode usar [CallerMemberName]
Exemplo: um configurador de propriedades (para responder à parte 2):
O compilador fornecerá literais de seqüência de caracteres correspondentes nos locais de chamada, portanto, basicamente não há sobrecarga de desempenho.
fonte
StackFrame(1)
método descrito em outras respostas para o log, que parecia funcionar até que o Jitter decidiu começar a alinhar as coisas. Eu não queria adicionar o atributo para impedir a inclusão por motivos de desempenho. O uso da[CallerMemberName]
abordagem corrigiu o problema. Obrigado!OnPropertyChanged("SomeProperty")
e nãoOnPropertyChanged("SetProperty")
Para não
async
métodos, pode-se usarhttps://docs.microsoft.com/en-us/dotnet/api/system.reflection.methodbase.getcurrentmethod
Por favor, lembre-se que para os
async
métodos ele retornará "MoveNext".fonte
async
método, você provavelmente obterá "MoveNext" como nome do método.O snippet fornecido por Lex foi um pouco longo, então estou apontando a parte importante, pois ninguém mais usou exatamente a mesma técnica:
Isso deve retornar resultados idênticos à técnica MethodBase.GetCurrentMethod (). Name , mas ainda vale a pena salientar, porque eu poderia implementar isso uma vez em seu próprio método usando o índice 1 para o método anterior e chamá-lo de várias propriedades diferentes. Além disso, ele retorna apenas um quadro em vez de todo o rastreamento da pilha:
É um one-liner, também;)
fonte
Tente isso dentro do método Main em um programa de console vazio:
Saída do console:
Main
fonte
Sim definitivamente.
Se você deseja manipular um objeto, eu realmente uso uma função como esta:
Está linha:
Percorre o quadro da pilha para encontrar o método de chamada e usamos a reflexão para obter os valores das informações dos parâmetros passados a ele para uma função genérica de relatório de erros. Para obter o método atual, basta usar o quadro de pilha atual (1).
Como já foi dito para o nome dos métodos atuais, você também pode usar:
Eu prefiro andar na pilha porque se olhar internamente para esse método, ele simplesmente cria um StackCrawlMark de qualquer maneira. Dirigir-se à pilha diretamente parece mais claro para mim
Na publicação 4.5, agora você pode usar o [CallerMemberNameAttribute] como parte dos parâmetros do método para obter uma sequência do nome do método - isso pode ajudar em alguns cenários (mas na verdade, digamos o exemplo acima)
Isso parecia ser principalmente uma solução para o suporte do INotifyPropertyChanged, onde anteriormente você tinha strings espalhadas por todo o código do evento.
fonte
Comparando maneiras de obter o nome do método - usando uma construção de temporização arbitrária no LinqPad:
CÓDIGO
RESULTADOS
reflexão reflexão
stacktrace stacktrace
inlineconstant inlineconstant
constante constante
expr e => e.expr ()
exprmember exprmember
callermember Main
Observe que os métodos
expr
ecallermember
não estão "certos". E aí você vê uma repetição de um comentário relacionado de que a reflexão é ~ 15x mais rápida que o rastreamento de pilha.fonte
Edição: MethodBase é provavelmente uma maneira melhor de apenas obter o método em que você está (em oposição a toda a pilha de chamadas). Eu ainda estaria preocupado em incluir no entanto.
Você pode usar um StackTrace dentro do método:
E o olhar para os quadros:
No entanto, esteja ciente de que, se o método estiver embutido, você não estará dentro do método que pensa estar. Você pode usar um atributo para evitar inlining:
fonte
new StackTrace(true)
vez denew StackTrace(false)
. Definir isso paratrue
que o rastreamento da pilha tente capturar o nome do arquivo, o número da linha e etc., o que pode tornar a chamada mais lenta. Caso contrário, uma resposta agradávelA maneira simples de lidar é:
Se o System.Reflection estiver incluído no bloco using:
fonte
Que tal isso:
fonte
Eu acho que você deve conseguir isso criando um StackTrace . Ou, como mencionam @ edg e @ Lars Mæhlum , MethodBase. GetCurrentMethod ()
fonte
Tente isso ...
fonte
Eu fiz isso com uma classe estática simples:
então no seu código:
fonte
fonte