Dans une méthode non statique, je pourrais utiliser this.GetType()
et cela renverrait le fichier Type
. Comment puis-je obtenir la même chose Type
dans une méthode statique? Bien sûr, je ne peux pas simplement écrire typeof(ThisTypeName)
car il ThisTypeName
n'est connu que dans l'exécution. Merci!
c#
.net
types
static-methods
Yegor
la source
la source
Réponses:
Si vous recherchez une doublure 1 équivalente aux
this.GetType()
méthodes statiques, essayez ce qui suit.Bien que cela soit probablement beaucoup plus cher que la simple utilisation
typeof(TheTypeName)
.la source
typeof(TheTypeName)
quand même s'en occuper .Il y a quelque chose que les autres réponses n'ont pas tout à fait clarifié, et qui est pertinent pour votre idée du type n'étant disponible qu'au moment de l'exécution.
Si vous utilisez un type dérivé pour exécuter un membre statique, le nom du type réel est omis dans le binaire. Par exemple, compilez ce code:
Maintenant, utilisez ildasm dessus ... vous verrez que l'appel est émis comme ceci:
Le compilateur a résolu l'appel à
Encoding.GetEncoding
- il n'y a aucune trace deUnicodeEncoding
gauche. Cela rend votre idée du "type actuel" absurde, j'en ai peur.la source
Une autre solution consiste à utiliser un type auto-référencé
Ensuite, dans la classe qui en hérite, je crée un type d'auto-référencement:
Maintenant, le type d'appel typeof (TSelfReferenceType) à l'intérieur de Parent obtiendra et retournera le Type de l'appelant sans avoir besoin d'une instance.
-Rob
la source
Vous ne pouvez pas utiliser
this
dans une méthode statique, ce n'est donc pas possible directement. Cependant, si vous avez besoin du type d'un objet, appelez-GetType
le simplement et faites de l'this
instance un paramètre que vous devez passer, par exemple:Cela semble cependant être une mauvaise conception. Êtes-vous sûr que vous avez vraiment besoin d'obtenir le type de l'instance elle-même dans sa propre méthode statique? Cela semble un peu bizarre. Pourquoi ne pas simplement utiliser une méthode d'instance?
la source
Je ne comprends pas pourquoi vous ne pouvez pas utiliser typeof (ThisTypeName). S'il s'agit d'un type non générique, cela devrait fonctionner:
S'il s'agit d'un type générique, alors:
Est-ce que je rate quelque chose d'évident ici?
la source
Lorsque votre membre est statique, vous saurez toujours de quel type il fait partie au moment de l'exécution. Dans ce cas:
Vous ne pouvez pas appeler (modifier: apparemment, vous pouvez, voir le commentaire ci-dessous, mais vous appelleriez toujours en A):
comme le membre est statique, il ne joue pas de rôle dans les scénarios d'héritage. Ergo, vous savez toujours que le type est A.
la source
Pour mes besoins, j'aime l'idée de @ T-moty. Même si j'utilise des informations de "type d'auto-référencement" depuis des années, il est plus difficile de référencer la classe de base plus tard.
Par exemple (en utilisant l'exemple @Rob Leclerc ci-dessus):
Travailler avec ce modèle peut être difficile, par exemple; comment renvoyez-vous la classe de base à partir d'un appel de fonction?
Ou lors du casting de type?
Alors, j'essaye de l'éviter quand je le peux et de l'utiliser quand je le dois. Si vous le devez, je vous suggère de suivre ce modèle:
Vous pouvez désormais (plus) facilement travailler avec le
BaseClass
. Cependant, il y a des moments, comme ma situation actuelle, où exposer la classe dérivée, à partir de la classe de base, n'est pas nécessaire et utiliser la suggestion de @ M-moty pourrait être la bonne approche.Cependant, l'utilisation du code de @ M-moty ne fonctionne que tant que la classe de base ne contient aucun constructeur d'instance dans la pile d'appels. Malheureusement, mes classes de base utilisent des constructeurs d'instances.
Par conséquent, voici ma méthode d'extension qui prend en compte les constructeurs d'instance de la classe de base:
la source
EDIT Cette méthode ne fonctionnera que lorsque vous déployez des fichiers PDB avec l'exécutable / bibliothèque, comme markmnl m'a fait remarquer.
Sinon, ce sera un énorme problème à détecter: fonctionne bien en développement, mais peut-être pas en production.
Méthode utilitaire, appelez simplement la méthode quand vous en avez besoin, de chaque endroit de votre code:
la source