2009-07-02 2 views
4

Рассмотрим следующий код:Возвращение имя класса, в котором статический метод заключается

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

Можно ли получить имя класса, в котором статический метод проживает? В связи с тем, что им с помощью статического метода, не представляется возможным использовать этот указатель, чтобы получить тип объекта, который им в настоящее время работает.

+0

Pls уточняет, что вы подразумеваете под этим «указателем» – abhilash

+1

@AB Колан: Я полагаю, что Russel ссылается на ключевое слово «this». –

ответ

17

Попробуйте следующее

return typeof(MyClass).Name; 

Или же

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

Побей меня! :) – 2009-07-02 13:11:40

2

Вы можете сделать это ...

String className = typeof(MyClass).Name; 
1

Попробуйте это:

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(); 
     } 
    } 
} 

Консоль будет показывать «ConsoleApplication1.Program» =)

+0

OP ищет имя класса, а не имя метода. – JaredPar

+0

Кроме того, вам не нужно указывать в MemberInfo. m.Name должно быть достаточно. –

+0

@ JaredPar - Да, я понял, что я плохой, d'oh =) – Rob

2

I может отсутствовать пункт полностью здесь, но то, что случилось со строкой «MyClass»?

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

Вы можете возразить, что если MyClass наследуется, вы хотели бы, чтобы имя наследуемого класса вместо. Тогда рассмотрим следующее:

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

Теперь, как вы думаете, вы увидите в консоли, если вы вызываете MyOtherClass.SomeMethod? Ответ: «MyClass». Таким образом, поиск имени класса динамически даст вам тот же результат, что и просто введя его в строку. Единственный потенциал роста, который я могу видеть с помощью Reflection, заключается в том, что он по-прежнему будет давать правильный результат, если вы переименуете класс.

+0

Он может захотеть, чтобы он был рефакторингом. И для наследования, конечно, хотя это сложно. –

+0

Это может быть довольно неплохая оценка эффективности при сохранении безопасности для рефакторинга. И, как я указываю в своем ответе, нет наследуемого потенциала, поскольку он является статическим методом; он всегда будет возвращать имя базового класса. –

Смежные вопросы