2009-07-02 8 views
4

Consultez le code suivant:nom de la classe de retour dans lequel une méthode statique réside

public class MyClass 
{ 
    public static string MyStaticMethod() 
    { 
      //string className = GetClassNameHere... 
    } 
} 

Est-il possible d'obtenir le nom de la classe dans laquelle la méthode statique réside? En raison du fait que im en utilisant une méthode statique, il est impossible d'utiliser le ce pointeur pour récupérer le type de l'objet qui im ​​travaille actuellement.

+0

Veuillez préciser ce que vous entendez par "ce pointeur" – abhilash

+1

@AB Kolan: Je suppose que Russel fait référence au mot-clé "this". –

Répondre

17

Effectuez les opérations suivantes

return typeof(MyClass).Name; 

Ou aussi

return MethodBase.GetCurrentMethod().DeclaringType.Name; 
+0

Battez-moi! :) –

2

Vous pouvez le faire ...

String className = typeof(MyClass).Name; 
1

Essayez ceci:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MethodBase m = MethodInfo.GetCurrentMethod(); 
      MemberInfo info = (MemberInfo)m; 
      Console.WriteLine(info.DeclaringType.FullName); 
      Console.ReadKey(); 
     } 
    } 
} 

La console affiche "ConsoleApplication1.Program" =)

+0

OP recherche le nom de la classe, pas le nom de la méthode. – JaredPar

+0

De même, vous ne devriez pas avoir besoin de transtyper sur MemberInfo. m.Name devrait suffire. –

+0

@JaredPar - Yup, j'ai réalisé mon mauvais, d'oh =) – Rob

2

Je peut manquer le point tout à fait, mais ce qui ne va pas avec la chaîne "MyClass"?

public class MyClass 
{ 
    public static string MyStaticMethod() 
    { 
      string className = "MyClass"; 
      Console.WriteLine(className); 
    } 
} 

Vous pouvez faire valoir que si MyClass est héritée, vous voulez que le nom de la classe à la place héritée. Puis considérer les points suivants:

public class MyClass 
{ 
    public static string MyStaticMethod() 
    { 
     string className = typeof(MyClass).Name; 
     Console.WriteLine(className); 
    } 
} 
public class MyOtherClass : MyClass{ } 

Maintenant, que pensez-vous que vous verrez dans la console si vous invoquez MyOtherClass.SomeMethod? La réponse est "MyClass". Ainsi, rechercher dynamiquement le nom de la classe vous donnera exactement le même résultat que simplement le saisir dans une chaîne. Le seul avantage que je peux voir avec l'obtention de Reflection est qu'il rendra toujours le résultat correct si vous renommez la classe.

+0

Il pourrait vouloir que ce soit refactoring-safe. Et pour l'héritage bien sûr, même si c'est difficile. –

+0

Il peut s'agir d'une pénalité de performance plutôt bonne pour assurer la sécurité du refactoring. Et comme je le souligne dans ma réponse, il n'y a pas d'héritage à la hausse car c'est une méthode statique; il retournera toujours le nom de la classe de base. –

Questions connexes