如何知道调用哪个方法的对象?

时间:2012-01-25 10:41:12

标签: c# .net

我有一个静态类,从另一个类的实例调用哪些方法。如何在不添加方法参数的情况下知道哪个实例调用方法

示例:

static class SomeStaticClass
{
 public static void SomeGreatMethod (/*NO PARAMETERS*/)
 {
   LittleClass caller = //How to obtain caller instance here?
 }
}

class LittleClass
{
 public void SomeMethod ()
 {
   //some code
   SomeStaticClass.SomeGreatMethod (/*NO PARAMETERS*/);
 }
}

4 个答案:

答案 0 :(得分:2)

您可以通过创建堆栈跟踪找出哪个包含调用方法 - 尽管内联可能会弄乱它。

除非您使用调试API,否则无法找出正在进行调用的实例

如果你需要 这些东西,你可能遇到了设计问题。框架的某些区域做了类似于强制安全的事情,但这是一种非常罕见的情况。通常,如果您需要SomeGreatMethod中的信息,则只需将其作为调用的一部分提供 - 或者将其作为非静态类中的实例方法,并提供适当的上下文有关施工的信息。

答案 1 :(得分:0)

您可以获得StackFrame并从中读取整个堆栈跟踪

答案 2 :(得分:0)

看看这里,你需要使用callstack

http://www.csharp-examples.net/reflection-calling-method-name/

答案 3 :(得分:0)

有时候我会用这个

private static Type GetCallingMethodHolderType()
{
   const int iCallDeepness = 0; //can vary this ...
   System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(false);
   System.Diagnostics.StackFrame sframe = stack.GetFrame(iCallDeepness);
   return sframe.GetMethod().ReflectedType; //This will return a TYPE which holds the method.
}

编辑

我编辑了帖子,以便返回保存调用方法的对象的TYPE。 Instance ,就像你要求的那样,imo,它是不可能获得的。

应该为你工作。