C# 静态类';的静态方法将知道调用方?
假设我有一个静态类和一个静态方法。它必须由10个不同的类访问。但是静态类如何知道谁调用了它:(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
这是一个面试问题……请重新措辞并回答我,我是新来的:(你可以使用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)
。并查看构造函数的文档。