我有两个课程如下:
第一个:
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
作为类名。如何获取调用类名称?
答案 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