Em um método não estático, eu poderia usar this.GetType()
e ele retornaria o Type
. Como posso obter o mesmo Type
em um método estático? Claro, eu não posso simplesmente escrever typeof(ThisTypeName)
porque ThisTypeName
é conhecido apenas em tempo de execução. Obrigado!
c#
.net
types
static-methods
Yegor
fonte
fonte
Respostas:
Se você está procurando um liner 1 que é equivalente aos
this.GetType()
métodos estáticos, tente o seguinte.Embora isso seja provavelmente muito mais caro do que apenas usar
typeof(TheTypeName)
.fonte
typeof(TheTypeName)
qualquer maneira.Há algo que as outras respostas não esclareceram e que é relevante para a sua ideia do tipo estar disponível apenas em tempo de execução.
Se você usar um tipo derivado para executar um membro estático, o nome do tipo real será omitido no binário. Portanto, por exemplo, compile este código:
Agora use ildasm nele ... você verá que a chamada é emitida assim:
O compilador resolveu a chamada para
Encoding.GetEncoding
- não há vestígios deUnicodeEncoding
esquerda. Isso torna a sua ideia do "tipo atual" absurda, infelizmente.fonte
Outra solução é usar um tipo autorreferencial
Então, na classe que o herda, faço um tipo de autorreferência:
Agora, o tipo de chamada typeof (TSelfReferenceType) dentro de Parent obterá e retornará o Type do chamador sem a necessidade de uma instância.
-Roubar
fonte
Você não pode usar
this
em um método estático, então isso não é possível diretamente. Porém, se você precisa do tipo de algum objeto, basta chamáGetType
-lo e fazer dathis
instância um parâmetro que você deve passar, por exemplo:No entanto, este parece ser um design ruim. Tem certeza de que realmente precisa obter o tipo da própria instância dentro de seu próprio método estático? Isso parece um pouco bizarro. Por que não usar apenas um método de instância?
fonte
Não entendo por que você não pode usar typeof (ThisTypeName). Se este for um tipo não genérico, isso deve funcionar:
Se for um tipo genérico, então:
Estou perdendo algo óbvio aqui?
fonte
Quando seu membro é estático, você sempre saberá de que tipo ele faz parte em tempo de execução. Nesse caso:
Você não pode ligar (editar: aparentemente, você pode, veja o comentário abaixo, mas você ainda estaria ligando em A):
como o membro é estático, ele não faz parte dos cenários de herança. Portanto, você sempre sabe que o tipo é A.
fonte
Para os meus propósitos, gosto da ideia de @T-moty. Embora eu tenha usado informações de "tipo de autorreferência" por anos, referenciar a classe base é mais difícil de fazer mais tarde.
Por exemplo (usando o exemplo de @Rob Leclerc acima):
Trabalhar com esse padrão pode ser desafiador, por exemplo; como você retorna a classe base de uma chamada de função?
Ou quando digitar o casting?
Portanto, tento evitá-lo quando posso e usá-lo quando preciso. Se necessário, sugiro que siga este padrão:
Agora você pode (mais) trabalhar facilmente com o
BaseClass
. No entanto, há momentos, como minha situação atual, em que expor a classe derivada, de dentro da classe base, não é necessário e usar a sugestão de @M-moty pode ser a abordagem certa.No entanto, usar o código de @M-moty funciona apenas enquanto a classe base não contiver nenhum construtor de instância na pilha de chamadas. Infelizmente, minhas classes base usam construtores de instância.
Portanto, aqui está meu método de extensão que leva em consideração os construtores de 'instância' da classe base:
fonte
EDITAR Este método funcionará apenas quando você implantar arquivos PDB com o executável / biblioteca, como markmnl apontou para mim.
Caso contrário, será um grande problema a ser detectado: funciona bem no desenvolvimento, mas talvez não na produção.
Método utilitário, basta chamar o método quando precisar, de qualquer lugar do seu código:
fonte