.NET: Определите тип “этого” класса в его статическом методе

В нестатическом методе я мог использовать this.GetType() и это возвратилось бы Type. Как я могу получить то же Type в статическом методе? Конечно, я не могу просто записать typeof(ThisTypeName) потому что ThisTypeName известен только во времени выполнения.Спасибо!

92
задан Yegor 5 August 2013 в 05:16
поделиться

5 ответов

Математическая библиотека DotNumerics является свободным/открытым проектом, написанным на C # и содержащим перевод Lapack, Blas и Eispack на C #.

-121--2403014-

У меня нет доступа к C #, поэтому я не могу попробовать это... но вы должны быть в состоянии избежать слишком много обратной слежения, заставив движок найти конец последовательности сначала, а затем сопоставить расширения:

$(?<=\.(gif|png|jpg))

Я не уверен в том, какое влияние взгляд позади имеет на производительность, хотя.

-121--3067628-

Если вы ищете 1 лайнер, эквивалентный this.GetType () для статических методов, попробуйте выполнить следующие действия.

Type t = MethodBase.GetCurrentMethod().DeclaringType

Хотя это, скорее всего, намного дороже, чем просто использование типа (TheTypeName) .

129
ответ дан 24 November 2019 в 06:26
поделиться

Я не понимаю, почему вы не можете использовать Typeof (ThistyPename). Если это неребный тип, то это должно работать:

class Foo {
   static void Method1 () {
      Type t = typeof (Foo); // Can just hard code this
   }
}

Если это универсальный тип, то:

class Foo<T> {
    static void Method1 () {
       Type t = typeof (Foo<T>);
    }
}

Я упускаю что-то очевидное здесь?

3
ответ дан 24 November 2019 в 06:26
поделиться

Можно также рассмотреть возможность использования SortedDictionary.

При вставке предметов сортируется на основе клавиши. больше..

-121--4180394-

Посмотрите здесь , если вам нужна услуга NER корпоративного класса. Разработка системы NER (и обучающих наборов) является очень трудоемкой и высокопрофессиональной задачей.

-121--3792439-

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

При использовании производного типа для выполнения статического члена имя реального типа опускается в двоичном файле. Так, например, скомпилировать этот код:

UnicodeEncoding.GetEncoding(0);

Теперь использовать ildasm на нем... вы увидите, что вызов выдан следующим образом:

IL_0002:  call       class [mscorlib]System.Text.Encoding 
[mscorlib]System.Text.Encoding::GetEncoding(int32)

Компилятор разрешил вызов Encoding.GetEncoding - не осталось следа UniceyEncoding . Боюсь, это делает ваше представление о «нынешнем типе.»

58
ответ дан 24 November 2019 в 06:26
поделиться

Нельзя использовать этот в статическом методе, так что это невозможно напрямую. Однако, если вам нужен тип какого-то объекта, просто вызовите GetType и сделайте экземпляр this параметром, который вы должны передать, например:

public class Car {
  public static void Drive(Car c) {
    Console.WriteLine("Driving a {0}", c.GetType());
  }
}

Это кажется плохой конструкцией. Вы уверены, что вам действительно нужно получить тип самого экземпляра внутри его собственного статического метода? Это кажется немного странным. Почему бы просто не использовать метод экземпляра?

public class Car {
  public void Drive() { // Remove parameter; doesn't need to be static.
    Console.WriteLine("Driving a {0}", this.GetType());
  }
}
6
ответ дан 24 November 2019 в 06:26
поделиться

Когда ваш член статичен, вы всегда будете знать, какой тип это часть во время выполнения. В этом случае

class A
{
  public static int GetInt(){}

}
class B : A {}

Вы не можете позвонить (редактировать: по-видимому, можно увидеть комментарий ниже, но вы все равно должны звонить в а):

B.GetInt();

, потому что член статичен, он не играет в сценарии наследования. Ergo, вы всегда знаете, что тип A.

0
ответ дан 24 November 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: