Pergunta

Gostaria de poder obter todos os valores dos parâmetros do quadro de pilha no .NET.Um pouco como você consegue ver os valores na pilha de chamadas quando está no depurador do Visual Studio.A minha abordagem concentrou-se na utilização do Classe StackFrame e depois refletir sobre um Informações de parâmetro variedade.Tive sucesso com reflexão e propriedades, mas isso está se mostrando um pouco mais complicado.

Existe uma abordagem para conseguir isso?

O código até agora está assim:

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Go(1);
    }
}

public class A
{
    internal void Go(int x)
    {
        B b = new B();
        b.Go(4);
    }
}

public class B
{
    internal void Go(int y)
    {
        Console.WriteLine(GetStackTrace());

    }
    public static string GetStackTrace()
    {
        StringBuilder sb = new StringBuilder();
        StackTrace st = new StackTrace(true);
        StackFrame[] frames = st.GetFrames();

        foreach (StackFrame frame in frames)
        {
            MethodBase method = frame.GetMethod();

            sb.AppendFormat("{0} - {1}",method.DeclaringType, method.Name);
            ParameterInfo[] paramaters = method.GetParameters();
            foreach (ParameterInfo paramater in paramaters)
            {
                sb.AppendFormat("{0}: {1}", paramater.Name, paramater.ToString());
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }
}

A saída é semelhante a esta:

SfApp.B - GetStackTrace
SfApp.B - Go
y: Int32 y
SfApp.A - Go
x: Int32 x
SfApp.Program - Main
args: System.String[] args

Eu gostaria que fosse mais parecido com isto:

SfApp.B - GetStackTrace
SfApp.B - Go
y: 4
SfApp.A - Go
x: 1
SfApp.Program - Main

Apenas para contextualizar, meu plano era tentar usar isso quando lançar minhas próprias exceções.Analisarei suas sugestões com mais detalhes e verei se consigo considerá-las adequadas.

Foi útil?

Solução

Parece que não pode ser feito dessa maneira.Ele fornecerá apenas metainformações sobre o método e seus parâmetros.Não é o valor real no momento da pilha de chamadas.

Alguns sugerem derivar suas aulas de ContextBoundObject E use IMessageSink para ser notificado sobre todas as chamadas de método e os valores dos parâmetros.Isso normalmente é usado para Comunicação remota .NET.

Outra sugestão pode ser escrever um depurador.É assim que o IDE obtém suas informações.A Microsoft tem Mdbg dos quais você pode obter o código-fonte.Ou escreva um Perfilador CLR.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top