Используйте отражение C # для доступа к объекту вверх по трассе стека - PullRequest
3 голосов
/ 07 августа 2009

Я хотел бы использовать отражение в .NET, чтобы получить доступ к объекту, который вызвал мой метод. Я предполагаю, что каким-то образом можно просмотреть трассировку стека. Я знаю, что это небезопасно по ряду причин, но мне просто нужно собрать и каталогизировать некоторые значения свойств.

Как мне это сделать?

Обновление : я идиот, я забыл сказать, что это было в C #

Ответы [ 3 ]

5 голосов
/ 07 августа 2009
var methodInfo = new StackFrame(1).GetMethod();

Возвращает метод, вызвавший текущий метод.

Обратите внимание, что компилятор может встроить или иным образом оптимизировать вызовы методов (хотя может показаться, что это не так), что препятствует ожидаемому поведению. Чтобы быть в безопасности, украсьте свой метод с помощью:

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]

Обратите внимание, что это противоречит разрешению компилятору выполнять свою работу. Будьте бдительны.

РЕДАКТИРОВАНИЕ Ой, я вижу, что вы хотите экземпляр , который вызвал ваш метод. Нет никакой возможности получить эту информацию.

2 голосов
/ 07 августа 2009

Вы можете использовать классы StackTrace & StackFrame

вот пример из MSDN

http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.aspx

Это пример, который должен напечатать "Main"

class Program
{
    static void Main(string[] args){
        Func();
    }
    static void Func(){
        StackFrame frame = new StackFrame(1);
        StackTrace trace = new StackTrace(frame);
        var method = frame.GetMethod();
        Console.WriteLine(method.Name);
    }
}
2 голосов
/ 07 августа 2009

Что если статический метод вызывает вас?

Разве не было бы лучше (проще) заключить контракт с вызывающим абонентом, если бы они передали его вам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...