C # статическое "это" - PullRequest
       28

C # статическое "это"

14 голосов
/ 08 октября 2010

Есть ли способ в статическом методе C # ссылаться на тип, в котором определен метод?

В методе экземпляра вы можете определить тип по:

public void Foo()
{
    Type type = this.GetType();
}

как бы это выглядело в статическом методе?

public static void Bar()
{
    Type type = ....?
}

Обновление: Извините, требуется уточнение: Я знаю функцию typeof(...). Я ищу ключевое слово или код, который дает мне тип без явной ссылки на имя класса.

Обновление: Помимо ответа Developer Art, который делает именно то, что я искал, есть ли более простой способ?

Ответы [ 7 ]

23 голосов
/ 08 октября 2010

Вот, пожалуйста:

public static void Bar()
{
  Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
}

Редактировать: обновлено, чтобы исправить ошибку - DeclaringType является свойством.

13 голосов
/ 08 октября 2010
public class Foo {
   public static void Bar() {
      Type type = typeof(Foo);
   }
}

Вы также можете использовать трассировку стека

public class Foo {
   public static void Bar() {
        Type type = new StackTrace().GetFrame(0).GetMethod().DeclaringType;
   }
}
4 голосов
/ 08 октября 2010
class ClassA
{
    public static void Bar()
    {
        Type t = typeof(ClassA);
    }
}

Капитан Очевидно, я знаю.

2 голосов
/ 08 октября 2010

Почему бы вам не использовать typeof?

public class Foo
{
  public static void Bar()
  {
    Type type = typeof(Foo);
  }
}

Или, как предложил Developer Art, вы можете сделать это с помощью отражения, но это будет медленнее.

1 голос
/ 08 октября 2010

Это немного запутанно, но я думаю, что вы также можете пойти по пути паттерна синглтонного типа

public class Foo
{
    private static Foo _Instance = new Foo();
    public static Type Bar()
    {
        return _Instance.GetType();
    }
}
1 голос
/ 08 октября 2010

Вы можете использовать

 Type t = typeof ( Program );

Очень необычным способом было бы использовать StackTrace, взяв тип последнего кадра ...

0 голосов
/ 28 октября 2016

Если класс - это форма, и она открыта (вам также нужно имя формы);

Application.OpenForms["MainForm"].GetType();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...