Определить выполняемый в настоящее время метод
Предположим, следующий код
private AutoResetEvent m_MethodDone = new AutoResetEvent(false);
private void Method1()
{
// Do something
Method2();
}
private void Method2()
{
// All done
m_MethodDone.Set();
}
private void Method3()
{
}
private void Program()
{
Task t = New Task(() => { // Code In Question
m_MethodDone.WaitOne()
Method3();
});
t.Start();
// Do other things.
}
Вопрос
Есть ли способ "захватить" события CLR, будь то событие или цикл в моем потоке?
if(SomeRunTimeThing.LastMethodExecuted.Name == "Method2")
Method3();
Зачем
Я не хочу вписывать перехватчики вызовов в кишки программного обеспечения, это заметная проблема (идеи хм приходят...) (на самом деле она соблюдает шаблон вызова пользовательского интерфейса для функциональности типа автоматизации).
3 ответа
Насколько я знаю, этот сценарий не поддерживается CLR.
Если бы это было так, это привело бы к всевозможным осложнениям. Например, обратите внимание, что компилятор может встроить ваш приватный метод, поэтому реальный код может выглядеть примерно так:
private void Method1()
{
// Body of Method 1
// Body of Method 2
}
В таком случае SomeRunTimeThing.LastMethodExecuted.Name
никогда не принимает значение Method2
, (Это также причина, по которой вы никогда не должны использовать информацию трассировки стека ни для чего, кроме ведения журнала и отладки.)
Если я понимаю: нужно определить последний вызванный метод без изменения кода методов. приходит на ум одно решение: использовать перехват для всех классов в socope. А в хранилище кода перехвата какой метод был вызван.
UPD, например, вы можете использовать единство, см.: http://msdn.microsoft.com/en-us/library/ff660861%28v=pandp.20%29.aspx
Нет простого способа отследить, какие вызовы были сделаны после факта, но вы можете увидеть, какой метод вызвал определенный метод. Возможно, вы можете использовать стек вызовов для решения вашей проблемы. См. http://www.csharp-examples.net/reflection-callstack/ для примера.