获取创建对象的类的名称

时间:2013-06-12 08:05:55

标签: c# .net reflection

我有两个课程如下:

第一个:

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调用TestClass.TestMethod1而后调用TestClass.TestMethod2时,我想在Class1内获得TestClass.TestMethod2的完全限定类名。我已经看到了这个link,但我想我会将TestClass.TestMethod1作为方法名称,TestClass作为类名。如何获取调用类名称?

4 个答案:

答案 0 :(得分: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 
  }

但我必须承认这是非常难看的

或许更好的方法是首先质疑为什么

答案 1 :(得分: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
    }
}

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

这将获得首次调用Type的{​​{1}}。它打印:

TestClass

TestStack.Class1
TestStack.Program