日期:2014-05-17  浏览次数:20891 次

基础知识,就怕你不会……千万别不会!

有 A 和 B 两个类,B类中有一个方法叫M1()。
假如我在A类的一个方法里调用B类中的M1方法,怎么在M1方法里写代码才能获取到当前调用它的类名或方法名?


------解决方案--------------------
获取当前调用的堆栈,里面有足够多的信息来满足你。
------解决方案--------------------
请看下StackTrace对象。获取当前方法调用的堆栈信息,里面的内容足够满足你了。
------解决方案--------------------
StackTrace stackTrace = new StackTrace();
StackFrame stackFrame0 = stackTrace.GetFrame(0);
Console.WriteLine(stackFrame0.GetMethod().Name);//当前方法名
StackFrame stackFrame1 = stackTrace.GetFrame(1);
Console.WriteLine(stackFrame1.GetMethod().Name);//调用这个方法的方法名
------解决方案--------------------
C# code

class A
{
    public C c = new C();
    public void CallM1Method()
    {
        c.M1();
    }
}
class B
{
    public C c = new C();
    public void CallM1Method()
    {
        c.M1();
    }
}
class C
{
    public void M1()
    {
        // 获取到底是 A 调用的还是 B 调用的
        Type aType = typeof(A);
        Type bType = typeof(B);
        StackTrace trace = new StackTrace();
        StackFrame[] frames = trace.GetFrames();

        foreach (StackFrame frame in frames)
        {
            Type t = frame.GetMethod().DeclaringType;
            if (t == aType)
            {
                Console.WriteLine("A invoke");
                break;
            }
            if (t == bType)
            {
                Console.WriteLine("B invoke");
                break;
            }
        }

    }
}