Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态类';的静态方法将知道调用方?_C#_.net_C# 4.0_Static_Static Methods - Fatal编程技术网

C# 静态类';的静态方法将知道调用方?

C# 静态类';的静态方法将知道调用方?,c#,.net,c#-4.0,static,static-methods,C#,.net,C# 4.0,Static,Static Methods,假设我有一个静态类和一个静态方法。它必须由10个不同的类访问。但是静态类如何知道谁调用了它:( 这是一个面试问题……请重新措辞并回答我,我是新来的:(你可以使用stracktace找出谁调用了静态方法 class Foo { public void static staticMethod() { // here i want to know who called me! StackTrace st = new StackTrace(); ... } } cl

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


这是一个面试问题……请重新措辞并回答我,我是新来的:(

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

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

在以下链接下查找有关反射的更多信息:


我会尝试以下方法:

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

    }
}
在这里,传递一个实例是最简单的方法。

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

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


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

您试图给出的答案是什么?“子类”静态类的子类?OP没有声明子类是静态类的子类。这可能有助于您-在c#vNext中,调用方属性可能会有帮助,但可能会被欺骗-这不是一个安全功能!我可能会使用一个对象,因为它将从10个不同的类调用。见鬼,在完整的示例中编辑,这是有效的当然是所有的子类。@MareInfinitus:You rock;)很酷,非常感谢,但是告诉我,为什么它给我的类型是“test.Program+derived+ChildClass”?我知道test.Program是我的类。但是我不知道什么是派生的,为什么+和所有的都来了:(我还有一个疑问,我把这个staticchildren类作为static,它的成员是“Children”也是静态的,当我刚刚声明方法“Children”时,我没有看到任何区别作为静态的…它在性能上有什么不同?@MareInfinitus:嘿,我观察到,如果类型不是Parentclass,很明显,如果我有任何其他类,它就不工作了……你对这种情况下的优化解决方案有什么建议?@MareInfinitus:完全正确,然后我使用了object,它工作得很好。非常感谢:)干杯谢谢你Stefan。但是我得到了你程序的结果“被AppDomain.nExecuting Assembly调用”:(上面的代码应该会告诉你这个想法。使用参数。最重要的是StackTrace构造函数的参数。请尝试例如
var trace=new StackTrace(1)
。并查看构造函数的文档。