3

想象一下,我有一个静态类和一个静态方法。它必须由 10 个不同的类访问。但是静态类如何知道谁调用了它:(

这是一个面试问题....请正确改写并回答我,我是新人:(

4

5 回答 5

2

由于 C# 没有适当的元对象系统,我知道的唯一方法是通过反射。下面的想法应该给出这个想法:

public static string GetCaller()
{
    var trace = new StackTrace(2);
    var frame = trace.GetFrame(0);
    var caller = frame.GetMethod();
    var callingClass = caller.DeclaringType.Name;
    var callingMethod = caller.Name;
    return String.Format("Called by {0}.{1}", callingClass, callingMethod);
}
于 2012-07-21T17:17:48.957 回答
1

我会尝试以下方法:

public class ParentClass
{
}

public class ChildClass :  ParentClass
{
}

public static class StaticClass
{
    public static void SomeMethod(ParentClass d)
    {
        var t = d.GetType();
    }
}

public class StaticChildren
{
    public void Children()
    {
        var p = new ChildClass();

        StaticClass.SomeMethod(p);

    }
}

只传递一个实例是您可以在这里做的最简单的事情。

于 2012-07-21T17:12:00.450 回答
0

您可以使用 stracktace 找出谁调用了静态方法!

class Foo
{
  public void static staticMethod()
  {
    // here i want to know who called me!
    StackTrace st = new StackTrace();
    ...
  }
}

class Bar
{
  public void Bar()
  {
    Foo.staticMethod();
  }
}
于 2012-07-21T17:06:15.543 回答
0

在这些情况下,您可以使用反射。

在这些链接下找到更多关于反射的信息: http ://www.csharp-examples.net/reflection-calling-method-name/

http://msdn.microsoft.com/en-us/library/ms173183(v=vs.80).aspx

于 2012-07-21T17:07:26.557 回答
0

如果方法的功能取决于调用它的人,那么设计可能不是很好。我会引入新参数。

出于调试目的,堆栈跟踪?

于 2012-07-21T18:14:59.357 回答