.NET Reflexão - Encontrar o tipo que define um membro estático
-
23-08-2019 - |
Pergunta
Eu tenho um problema com reflexão. Eu preciso encontrar o tipo que instancia um membro estático. Meus olhares código como este:
private class SimpleTemplate : PageTemplate
{
internal static readonly IPageProperty NameProperty =
PropertyRepository.Register("Name");
}
O PropertyRepository é um repositório de propriedades (obviamente). Ele mantém um registro de todas as propriedades que foram registrados usando o sistema do tipo que estou construindo.
A fim de fazer isso com sucesso, eu preciso manter o controle de todas as propriedades, mas também o tipo em que eles são definidos. Caso contrário, se duas propriedades com o mesmo nome são definidos, o repositório de propriedade não será capaz de distingui-los.
Então, o que eu quero fazer é descobrir o tipo que define a NameProperty e armazenar o tipo, bem como o nome. Como posso fazer isso?
Eu quero usar tipagem forte, ou seja, eu não quero para enviar o tipo como um argumento para PropertyRepository.Register. Isso seria propenso a erros já que não posso validar que o tipo de argumento está correto.
A solução, eu imagino, envolveria reflexão. Existe alguma maneira de usar a reflexão para determinar que tipo chama um método estático? As propriedades estáticas são implicitamente instanciado usando um construtor estática (que o compilador gera). Existe uma maneira para mim para obter um identificador para que o construtor? Isso parece viável, eu só não consigo descobrir como fazer isso.
Em outras palavras: se o método A chama o método B, existe alguma maneira B pode dizer que ele foi chamado de A usando a reflexão? Eu imagino que é, mas eu não consigo descobrir como.
Alguém sabe?
Editar:. Eu olhei para a classe StackFrame e enquanto parece fazer o que eu quiser, pode não ser confiável no código de produção (e eu preciso que)
Solução
Esta é quase uma cópia de esta questão , mas não muito . Olhada respostas Essa é uma embora.
Pessoalmente, eu acho que eu iria passar no tipo. Uma alternativa seria a utilização de um atributo, por exemplo.
[PropertyName("Name")]
private static readonly IPageProperty NameProperty = null;
static
{
PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
}
PropertyRepostiory.RegisterProperties
poderia, então, definir o valor do campo somente leitura usando a reflexão (se isso funciona - Eu não tentei isso, o readonly-ness pode ser executada). É um pouco icky embora ... Alternativamente, você pode simplesmente obter a propriedade do repositório quando você precisar dele.