我可以通过reflection/诊断从方法中获取调用实例吗?

有没有办法通过System.Reflection,System.Diagnostics或其他方法来获取对调用静态方法的实际实例的引用,而不将其传递给方法本身?

例如,沿着这些方向的东西

class A { public void DoSomething() { StaticClass.ExecuteMethod(); } } class B { public void DoSomething() { SomeOtherClass.ExecuteMethod(); } } public class SomeOtherClass { public static void ExecuteMethod() { // Returns an instance of A if called from class A // or an instance of B if called from class B. object caller = getCallingInstance(); } } 

我可以使用System.Diagnostics.StackTrace.GetFrames获取类型,但是有没有办法获得对实际实例的引用?

我知道reflection和性能的问题,以及静态到静态调用的问题,并且这通常,甚至可能几乎是不一致的,而不是正确的方法来解决这个问题。 这个问题的部分原因是我很好奇它是否可行; 我们目前正在传递实例。

 ExecuteMethod(instance) 

我只是想知道这是否可行并且仍然能够访问该实例。

 ExecuteMethod() 

@Steve Cooper:我没有考虑过扩展方法。 一些变化可能会奏效。

我不相信你能。 甚至StackTrace和StackFrame类也只提供命名信息,而不是访问实例。

我不确定你为什么要这样做,但要知道,即使你能做到这一点,也可能会很慢。

一个更好的解决方案是在调用ExecuteMethod之前将实例推送到线程本地上下文,您可以在其中检索它或者只是传递实例。

考虑将该方法作为扩展方法。 将其定义为:

 public static StaticExecute(this object instance) { // Reference to 'instance' } 

它被称为:

 this.StaticExecute(); 

我想不出一种方法可以直接做你想要做的事情,但我只能建议你如果找到了什么,你要注意静态方法,这些方法没有,而且有匿名方法,它们会有实例自动生成的类,这将有点奇怪。

我想知道你是否应该将调用对象作为一个适当的参数传递。 毕竟, static提示此方法不依赖于输入参数以外的任何其他方法。 另请注意,此方法可能是一个难以测试的方法,因为您编写的任何测试代码都不会与正在运行的系统具有相同的调用对象。

在静态方法调用静态方法的情况下,没有调用实例。

找到一种方法来完成你想要做的任何事情。

只需让ExecuteMethod获取一个对象。 然后你就拥有了实例,无论如何。

我觉得我在这里缺少一些东西。 可以从字面上的任何地方调用静态方法。 无法保证A类或B类实例将出现在调用堆栈中的任何位置。

必须有更好的方法来完成你想要做的任何事情。