Кадр стека ненадежен и предназначен только для целей отладки. Вы не можете предполагать, что здесь есть что-то полезное. Вот почему он находится в пространстве имен «Диагностика».
В более общем смысле, ваш вопрос демонстрирует фундаментальное недопонимание того, что говорит вам фрейм стека. Вы сказали
Цель состоит в том, чтобы создать универсальный экземпляр на основе типа, который назвал мой метод .
Кадр стека фактически не сообщает вам , кто вызвал ваш метод . Кадр стека сообщает вам , где управление вернется к . Фрейм стека является реализацией продолжения . Тот факт, что , который вызвал методы и , где контроль вернется к , почти всегда одно и то же, является источником вашего замешательства, но я вас уверяю, что они не обязательно должны быть одинаковыми.
В частности, новая функция «async / await», которая в настоящее время находится в предварительном выпуске, демонстрирует истинность этого. Код, который возобновляется с ожидающего, не имеет никакого понятия в кадре стека о том, кто вызвал его первоначально; эта информация потеряна навсегда. Поскольку код, который будет выполняться следующим , логически отделен от кода, который первоначально вызвал метод , кадр стека не содержит эту информацию.
Нам не нужно быть таким экзотическим, как это. Например, предположим, что метод M содержит вызов метода N, а N вызывает метод O. Если джиттер выбирает встроенный N внутри M, то кадр стека, наблюдаемый из O, не будет содержать N. Кадр стека говорит вам, где управление возобновляется, когда текущий метод возвращается. Когда O вернется, управление возобновится внутри M, а не N, поэтому кадр стека не содержит никакой информации о N.