2008-09-18 68 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

在調用靜態方法的靜態方法的情況下,沒有調用實例。

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

相關問題