C # obtenir son propre nom de classe


464

Si j'ai une classe appelée MyProgram, existe-t-il un moyen de récupérer " MyProgram " sous forme de chaîne?

Réponses:


743

Essaye ça:

this.GetType().Name

36
Si vous utilisez une méthode statique, le développeur sait quel est le nom du type. Vous pouvez simplement le saisir sous forme de chaîne dans le code source.
Eric Lippert

122
@EricLippert: Si vous tapez le nom, le compilateur ne l'attrapera pas si la classe est renommée.
Halvard

12
@Halvard: Premièrement, si la méthode statique est dans le type actuel, le nom est facultatif; si vous craignez que cela change, omettez-le. Deuxièmement, Visual Studio vous donnera automatiquement une balise active lorsque vous renommez une classe qui renomme toutes ses instances. Et troisièmement, si vous renommez une classe, les chances sont bonnes, vous devrez déjà faire beaucoup de changements dans beaucoup d'endroits.
Eric Lippert

12
@EricLippert Vous avez raison. Toute nouvelle version de Visual Studio ou ReSharper interceptera les chaînes portant le même nom que la classe en cours de changement de nom. Mon commentaire précédent n'est qu'une connaissance ancienne et désormais inutile ...
Halvard

17
@Halvard: ... et en C # 6, vous pouvez utiliser le nouvel nameofopérateur.
Eric Lippert

238

Je voulais jeter cela pour faire bonne mesure. Je pense que la façon dont @micahtan a été publiée est préférée.

typeof(MyProgram).Name

24
C'est en fait mieux, car: 1. Cela fonctionnera dans un contexte statique 2. C'est du temps de compilation calculé, donc ça ne coûte pas comme la réflexion
Gilbert

6
@JimBalter Il présente de multiples avantages: 1. Contexte statique. 2. La portion type ne sera pas réévaluée par le CLR à chaque fois - elle sera écrite dans le MSIL. 3. Il vous protège de quelqu'un déclarant un nouveau "GetType ()".
Gilbert

11
Si vous souhaitez obtenir le nom de classe hérité et que cet appel est dans le parent, cela ne fonctionnera pas.
Gh61

10
Cela présente l'inconvénient de devoir référencer explicitement le type, ce qui le rend moins facilement réutilisable.
cprcrack

20
En C # 6.0 ou version ultérieure, vous pouvez le faire nameof(MyProgram).
Owen Johnson

190

Avec C # 6.0, vous pouvez utiliser l' nameofopérateur:

nameof(MyProgram)

4
Grands trucs; fonctionne également avec les membres de type (tels que les méthodes et les propriétés) et même les variables - voir la documentation .
mklement0

127

Bien que la réponse de micahtan soit bonne, elle ne fonctionnera pas dans une méthode statique. Si vous souhaitez récupérer le nom du type actuel, celui-ci devrait fonctionner partout:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

2
Belle prise, même si je pense que ma méthode est préférée dans ce cas.
ChaosPandion

5
Cela ne fonctionnera pas pour les méthodes non virtuelles, car il renverra le nom du type dans lequel la méthode est déclarée et implémentée, (éventuellement dans la chaîne d'héritage), pas le type concret de l'instance dans laquelle vous exécutez réellement le code de.
Charles Bretana

1
Cela ne semble plus fonctionner dans le framework DNX (Dot Net Execution). Ils ont supprimé la méthode GetCurrentMethod () et n'ont laissé que GetMethodFromHandle ().
Astaar

C'est exactement ce dont j'avais besoin pour obtenir le nom de la classe concrète exécutant actuellement du code appelé à partir d'une fonction virtuelle dans un descendant.
DrFloyd5

15

Pour référence, si vous avez un type qui hérite d'un autre, vous pouvez également utiliser

this.GetType().BaseType.Name

12

Si vous en avez besoin dans les classes dérivées, vous pouvez mettre ce code dans la classe de base:

protected string GetThisClassName() { return this.GetType().Name; }

Ensuite, vous pouvez atteindre le nom dans la classe dérivée. Renvoie le nom de classe dérivé. Bien sûr, lors de l'utilisation du nouveau mot-clé "nameof", il n'y aura aucun besoin comme cette variété agit.

De plus, vous pouvez définir ceci:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

Et puis utilisez comme ceci:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}

10

Utilisez ceci

Supposons que Application Test.exe est en cours d'exécution et que la fonction est foo () dans form1 [fondamentalement, c'est la classe form1 ], le code ci-dessus générera une réponse ci-dessous.

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

Cela reviendra.

s1 = "TEST.form1"

pour le nom de la fonction:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

reviendra

s1 = foo 

Notez si vous souhaitez utiliser ceci en utilisation d'exception:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringType est déclaré [Nullable(2)]afin que vous obteniez un avertissement lorsque la vérification nulle est active.
Martin

@Martin, veuillez expliquer votre commentaire. Je ne comprends pas?
NoChance

2

thispeut être omis. Tout ce dont vous avez besoin pour obtenir le nom de la classe actuelle est:

GetType().Name

2

Obtenir le nom de classe actuel d'Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();

1
DeclaringType est déclaré [Nullable(2)] afin que vous obteniez un avertissement lorsque la vérification nulle est active.
Martin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.