有没有办法通过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获取类型,但有没有办法获得对实际实例的引用?
我知道反射和性能的问题,以及静态到静态调用的问题,并且这通常,甚至可能几乎是不一致的,而不是正确的方法来解决这个问题.这个问题的部分原因是我很好奇它是否可行; 我们目前正在传递实例.
ExecuteMethod(instance)
我只是想知道这是否可行并且仍然能够访问该实例.
ExecuteMethod()
@Steve Cooper:我没有考虑扩展方法.一些变化可能会奏效.
考虑使该方法成为扩展方法.将其定义为:
public static StaticExecute(this object instance) { // Reference to 'instance' }
它被称为:
this.StaticExecute();
我想不出一种方法可以直接做你想要做的事情,但我只能建议你如果找到了什么,你要注意静态方法,这些方法没有,而且有匿名方法,它们会有实例自动生成的类,这将有点奇怪.
我想知道你是否应该将调用对象作为一个适当的参数传递.毕竟,a static
暗示这个方法不依赖于输入参数以外的任何东西.另请注意,此方法可能是一个难以测试的方法,因为您编写的任何测试代码都不会与正在运行的系统具有相同的调用对象.
我不相信你能.甚至StackTrace和StackFrame类也只是为您提供命名信息,而不是对实例的访问.
我不确定你为什么要这样做,但要知道即使你能做到这一点也可能会很慢.
更好的解决方案是在调用ExecuteMethod之前将实例推送到线程本地上下文,您可以在其中检索它或只是传递实例.