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)

Foi útil?

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.

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