2008-09-18 38 views
9

有没有办法通过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库珀: 我没有考虑扩展方法。一些变化可能会奏效。

回答

4

我不相信你可以。即使StackTrace和StackFrame类只是给你命名信息,而不是访问实例。

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

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

1

只要有ExecuteMethod接受一个对象。无论如何你都有这个实例。

8

考虑使该方法成为扩展方法。其定义为:

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

这就是所谓的喜欢:

this.StaticExecute(); 

我不能想办法做你想直接做什么,但我只能建议,如果你找到的东西,你要注意静态方法,它不会有一个匿名方法,它们会有自动生成类的实例,这会有点奇怪。

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

+1

这是解决这个问题的非常优雅的方法 – ohmusama 2016-06-06 22:11:58

0

我觉得我错过了什么,在这里。静态方法可以从字面上任何地方调用。无法保证A类或B类实例将出现在调用堆栈的任何位置。

有一个更好的方式来完成你想要做的任何事情。

1

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

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

相关问题