1

我有两个课程如下:

第一:

class Class1
 {
     private void Method1()
      {
          var obj=new TestClass();
          obj.TestMethod1();
      }
 }

第二个:

class TestClass
 {
     public void TestMethod1()
      {
           TestMethod2();
      }

      private void TestMethod2()
       {
           //get the calling class 
       }
 }

当依次调用Class1.Method1时,我想获得inside的完全限定类名。我看过这个链接,但我想我会得到方法名和类名。如何获取调用类名?TestClass.TestMethod1TestClass.TestMethod2Class1TestClass.TestMethod2TestClass.TestMethod1TestClass

4

4 回答 4

7

没有很好的方法可以做到这一点。您可以访问堆栈帧(只需查看第二帧,而不是第一帧)——但这既昂贵又脆弱。您可以使用可选的 caller-member-name 属性(从 显式TestMethod1)来获取"Method1",但不是该"Class1"部分。另一种选择是显式传入一个对象(或只是名称);例如:

  private void Method1()
  {
      var obj=new TestClass();
      obj.TestMethod1(this);
  }
  public void TestMethod1(object caller=null,
             [CallerMemberName] string callerName=null)
  {
       TestMethod2(caller??this,callerName??"TestMethod1");
  }

  private void TestMethod2(object caller=null,
             [CallerMemberName] string callerName=null)
  {
      string callerName = ((caller??this).GetType().Name) + "." + callerName
      //get the calling class 
  }

但我不得不承认这很丑

也许更好的是质疑你为什么首先需要这个。

于 2013-06-12T08:12:20.793 回答
2

您不能通过构造函数将类型传递给第二个类,例如:

class Class1
{
    private void Method1()
    {
        Type t = typeof(Class1);
        var obj = new TestClass(t);
        obj.TestMethod1();
    }
}

class TestClass
{
    private Type _caller;

    public TestClass(Type type)
    {
        _caller = type;
    }
    public void TestMethod1()
    {
        TestMethod2();
    }

    private void TestMethod2()
    {
        //Do something with the class
    }
}
于 2013-06-12T08:14:39.357 回答
0

您可以查看此代码以找到您的解决方案,而无需传递类实例或类型参数等......:

class Program
{
    static void Main(string[] args)
    {
        var c = new Class1();
        c.Method1();
    }
}

class Class1
{
    public void Method1()
    {
        var obj = new TestClass();
        obj.TestMethod1();
    }
}

class TestClass
{
    public void TestMethod1()
    {
        TestMethod2();
        var mth = new StackTrace().GetFrame(1).GetMethod();
        var clss = mth.ReflectedType.Name;
        Console.WriteLine("Classname in Method1(): {0}", clss);
    }

    private void TestMethod2()
    {
        //get the calling class 
        var mth = new StackTrace().GetFrame(1).GetMethod();
        var clss = mth.ReflectedType.Name;
        Console.WriteLine("Class in .Method2(): {0}", clss);
    }
}
于 2013-06-12T08:21:58.527 回答
0

这将得到第Type一个调用的TestClass. 它打印:

TestStack.Class1
TestStack.Program

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace TestStack
{
    class Class1
    {
        public void Method1()
        {
            var obj = new TestClass();
            obj.TestMethod1();
        }
    }

    class TestClass
    {
        public void TestMethod1()
        {
            TestMethod2();
        }

        private void TestMethod2()
        {
            StackTrace st = new StackTrace();
            Type calling = null;
            foreach (var sf in st.GetFrames())
            {
                var type = sf.GetMethod().DeclaringType;
                if (type != this.GetType())
                {
                    calling = type;
                    break;
                }
            }
            Console.WriteLine(calling);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 class1 = new Class1();
            class1.Method1();
            TestClass testClass = new TestClass();
            testClass.TestMethod1();
        }
    }
}
于 2013-06-12T08:32:37.110 回答