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?

deltanovember
la source

Réponses:

743

Essaye ça:

this.GetType().Name
micahtan
la source
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
ChaosPandion
la source
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)
Cyanfish
la source
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;
Thomas Levesque
la source
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
mikeschuld
la source
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();
    }
}
bafsar
la source
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 );

}
Harshal Doshi Jain
la source
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
Mikael Engver
la source
2

Obtenir le nom de classe actuel d'Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();
Abbas ali
la source
1
DeclaringType est déclaré [Nullable(2)] afin que vous obteniez un avertissement lorsque la vérification nulle est active.
Martin