Код, который печатает тип, является методом базового класса. За исключением редких сценариев «Отражение», таких как приведенные выше, на выполнение не повлияет то, вызывается ли метод с использованием производного или базового типа, поэтому система не делает различий.
Однако вы можете обойти это, определив базовый базовый тип:
class ClassNameTesterBase<T>where T:ClassNameTester<T>
{
public static String getName() { return (typeof(T)).Name; }
}
и затем определение других типов интереса:
class ClassNameTester1<T> : ClassNameTesterBase<T> ...
class ClassNameTester2<T> : ClassNameTester1<T> ...
Затем можно при желании определить листовые классы:
class ClassNameTester1 : ClassNameTester1<ClassNameTester1> { }
class ClassNameTester2 : ClassNameTester2<ClassNameTester2> { }
Одним небольшим предостережением здесь является то, что ClassNameTester2 извлекает свои внутренние данные из ClassNameTester1 , но не может заменить ничего, что связано с ClassNameTester1 ; если он используется как статический класс, это не должно быть проблемой.