문제

.NET의 스택 프레임에서 모든 매개변수 값을 얻을 수 있기를 원합니다.Visual Studio 디버거에서 호출 스택의 값을 볼 수 있는 방법과 비슷합니다.내 접근 방식은 다음을 사용하는 데 집중되었습니다. StackFrame 클래스 그런 다음 곰곰히 생각해보면 매개변수정보 정렬.나는 리플렉션과 속성에 성공했지만 이것은 조금 더 까다롭다는 것이 증명되었습니다.

이를 달성하기 위한 접근 방식이 있나요?

지금까지의 코드는 다음과 같습니다.

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();
    }
}

출력은 다음과 같습니다.

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

나는 이것이 다음과 같이 보이길 바란다:

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

약간의 맥락을 설명하자면, 내 계획은 내가 예외를 던질 때 이것을 사용해 보는 것이었습니다.귀하의 제안을 더 자세히 살펴보고 그것이 적합한지 확인하겠습니다.

도움이 되었습니까?

해결책

그렇게는 할 수 없을 것 같습니다.메소드와 해당 매개변수에 대한 메타 정보만 제공합니다.호출 스택 당시의 실제 값이 아닙니다.

어떤 사람들은 수업을 다음에서 파생할 것을 제안합니다. ContextBoundObject 그리고 사용 IMessage싱크 모든 메소드 호출과 매개변수 값에 대해 알림을 받습니다.이는 일반적으로 다음 용도로 사용됩니다. .NET 원격.

또 다른 제안은 디버거를 작성하는 것입니다.이것이 IDE가 정보를 얻는 방법입니다.마이크로소프트는 Mdbg 그 중 소스 코드를 얻을 수 있습니다.아니면 CLR 프로파일러.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top