【问题标题】:How the static class's static method will know the caller?静态类的静态方法如何知道调用者?
【发布时间】:2012-07-21 17:01:51
【问题描述】:

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

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

【问题讨论】:

标签: c# .net c#-4.0 static static-methods


【解决方案1】:

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

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);
}

【讨论】:

  • 谢谢斯特凡。但我得到你的程序的结果为“由 AppDomain.nExecuting Assembly 调用”:(
  • 上面的代码应该告诉你这个想法。玩参数。最重要的是 StackTrace 的构造函数的参数。例如var trace = new StackTrace(1)。并查看构造函数的文档。
【解决方案2】:

我会尝试以下方法:

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);

    }
}

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

【讨论】:

  • 我可能会使用一个对象,因为它将从 10 个不同的类中调用
  • 什么鬼?在完整示例中进行了编辑,这当然适用于所有子类。
  • @MareInfinitus:你太棒了 ;) 非常感谢你,但是告诉我,为什么它给我的类型是“test.Program+derived+ChildClass”?我知道 test.program 是我的课。但我不明白派生的是什么以及为什么 + 和所有都来这里:(我还有一个疑问,我把这个 staticchildren 类设为静态,它的成员“Children”也是静态的,当我刚刚声明方法时我没有看到任何区别“孩子”作为静态...它的性能有何不同?
  • @MareInfinitus:嘿,我观察到,如果类型不是 Parentclass,很明显,如果我有任何其他类,它不起作用....您对优化解决方案有什么建议案例?
  • @MareInfinitus:完全正确,然后我使用了对象,它工作得很好。非常感谢 :) 干杯
【解决方案3】:

您可以使用 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();
  }
}

【讨论】:

    【解决方案4】:

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

    在以下链接中了解有关反射的更多信息: http://www.csharp-examples.net/reflection-calling-method-name/

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-03-02
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 2010-10-10
        • 2013-03-20
        相关资源
        最近更新 更多