Question

J'ai un problème avec la réflexion. Je dois trouver le type qui instancie un membre statique. Mon code ressemble à ceci:

    private class SimpleTemplate : PageTemplate
    {
        internal static readonly IPageProperty NameProperty =
            PropertyRepository.Register("Name");
    }

Le PropertyRepository est un référentiel de propriétés (évidemment). Il garde la trace de toutes les propriétés qui ont été enregistrées à l'aide du système de type que je vais construire.

Pour faire cela avec succès, je dois garder une trace de toutes les propriétés, mais aussi le type sur lequel elles sont définies. Dans le cas contraire, si deux propriétés avec le même nom sont définis, le référentiel de propriété ne sera pas en mesure de les distinguer.

Alors, ce que je veux faire est de trouver le type qui définit le NameProperty et stocker le type ainsi que le nom. Comment puis-je faire?

Je veux utiliser typage fort, à savoir que je ne veux pas envoyer le type comme argument pour PropertyRepository.Register. Ce serait sujette à l'erreur puisque je ne peux pas valider que l'argument de type est correct.

La solution, je pense, impliquerait la réflexion. Est-il possible d'utiliser la réflexion pour déterminer quel type appelle une méthode statique? Les propriétés statiques sont implicitement instanciés en utilisant un constructeur statique (que le compilateur génère). Est-il possible pour moi d'obtenir une poignée de ce constructeur? Cela semble faisable, je ne peux pas comprendre comment faire.

En d'autres termes: Si la méthode A méthode appelle B, est-il possible B peut dire qu'il a été appelé d'une réflexion à l'aide? J'imagine qu'il est, mais je ne peux pas savoir comment.

Quelqu'un sait-il?

Edit:. Je l'ai regardé la classe StackFrame et alors qu'il semble faire ce que je veux, il peut ne pas être fiable dans le code de production (et j'ai besoin que)

Était-ce utile?

La solution

est presque un double de cette question , mais pas tout à fait . Regardez que l'on les réponses cependant.

Personnellement, je pense que je passerais dans le type. Une alternative serait d'utiliser un attribut, par exemple.

[PropertyName("Name")]
private static readonly IPageProperty NameProperty = null;

static
{
    PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
}

PropertyRepostiory.RegisterProperties pourrait alors définir la valeur du champ en lecture seule utilisant la réflexion (si cela fonctionne - je ne l'ai pas essayé, peut-être appliquée readonly-ness). Il est un peu dégueu bien ... Sinon, vous pouvez simplement obtenir la propriété du référentiel lorsque vous en avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top