Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Как получить название класса в котором вызываем статический метод, который он наследует от другого родительского класса

Tickers.All();
class Tickers : Eloquent {
}
class Eloquent { public static void All() { Console.WriteLine("Класс из которого вызывали меня"); } }
Хочу в классе Eloquent получить название класса Tickers.
Подскажите пожалуйста)


Ответ

Статические методы привязаны к определенному типу и не наследуются. В вашем случае Tickers.All() на самом деле скомпилится в Eloquent.All(), поэтому в рантайме не будет даже упоминания о Tickers
Чтобы реализовать вашу задумку, нужно немного подшаманить:
Вариант 1
class Tickers : Eloquent { public static new void All() => Eloquent.All(); }
class Eloquent { public static void All() { var stacktrace = new StackTrace(); var prevframe = stacktrace.GetFrame(1); var method = prevframe.GetMethod();
Console.WriteLine($"Вызывающий класс: {method.ReflectedType.Name}"); } }
Либо, как прокомментировал @Grundy, посмотреть еще один способ. Если коротко, то:
Вариант 2
class Tickers : Eloquent { }
class Eloquent where T: Eloquent { public static void All() { Console.WriteLine($"Вызывающий класс: {typeof(T).Name}"); } }

Комментариев нет:

Отправить комментарий