Там какой-либо путь состоит в том, чтобы получить ссылку на вызывающий объект в c#?

22
задан Bill Tarbell 18 June 2019 в 17:23
поделиться

3 ответа

Нет, нет - по крайней мере, не используя профилирование/отладку API некоторого описания. Можно обойти стек для нахождения вызова метод с протестом, что это действительно медленно и может быть неточно из-за оптимизаций JIT. Это не скажет Вам, чем вызовом состоит в том объект , хотя (если действительно существует один).

20
ответ дан 29 November 2019 в 05:36
поделиться

Если Вы хотите получить тип, можно попробовать это:

новый StackFrame (1).GetMethod ().DeclaringType

Как Jon, на которого указывают там, мог бы быть проблемами при столкновении с монетой в пять центов optimisizations.

Что касается получения данных из объекта, я не думаю, что это возможно.

Редактирование

Только для разработки проблему оптимизации возьмите следующий код:

class stackTest
    {
        public void Test()
        {
            StackFrame sFrame = new StackFrame(1);
            if (sFrame == null)
            {
                Console.WriteLine("sFrame is null");
                return;
            }

            var method = sFrame.GetMethod();

            if (method == null)
            {
                Console.WriteLine("method is null");
                return;
            }
            Type declaringType = method.DeclaringType;
            Console.WriteLine(declaringType.Name);
        }

        public void Test2()
        {
            Console.WriteLine(new StackFrame(1).GetMethod().DeclaringType.Name);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            stackTest s = new stackTest();
            s.Test();
            Console.WriteLine("Doing Test2");
            s.Test2();
            Console.ReadLine();

        }
    }

Мы должны получить Программу к консоли дважды, и когда Вы работаете в отладчике, Вы делаете. Когда Вы работаете без отладчика в режиме выпуска, Вы получаете вывод от первой Тестовой функции. Который является прочертовским, потому что это к комплексу, который будет встроен; однако, второй метод вызывает исключение нулевой ссылки.

Другая опасность с этим кодом состоит в том, который в MS улучшает JIT-компилятор, что, возможно, работало в 2,0, мог отказать и гореть в будущих версиях.

3
ответ дан 29 November 2019 в 05:36
поделиться

Посмотрите этот вопрос:
можно ли использовать отражение для нахождения названия в настоящее время метода выполнения?

Это не дубликат, но ответ на тот вопрос ответит на Ваш также.

0
ответ дан 29 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

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