2013-03-11 46 views
3

X類使用反射方法來檢查Y類是否有特定的方法。 Y類有什麼方法可以找出X類方法正在檢查的方法的細節?一個班級是否有可能瞭解自己是否使用了反射?

+3

嗯。 Y類應該「意識到」自己的方法。你到底在問什麼? – spender 2013-03-11 14:32:41

+1

聽起來像太多的反思。關於反思的思考。請解釋你需要什麼。 – 2013-03-11 14:33:45

+0

總之:沒有。[15個字符] – 2013-03-11 14:33:52

回答

5

在類型定義上執行反射不是實例。

如果需要,實例用於檢索值,並且只是值的存儲位置,類型定義是此存儲區域的映射。

因此,無法指示是否在實例上使用了Reflection ......可以確定最近是否在Type上執行了反射(在最後一次垃圾收集器運行之前,思考反射Reflection),但是切線最好不要在這裏進一步探討,因爲它仍然不能解決你設定的問題。

當CLR執行反射時,它會這樣做,不會留下任何反射已執行的痕跡,從而節省與執行反射相關的內存成本。

不可能在不修改CLR的情況下留下任何這樣的指示。

解決此問題的另一種方法是提供一個反射緩存,它將類型信息存儲在Dictionary中,這將允許您確定是否反映了特定的類型,然後使用Dictionary中的信息,而不是再次進行反射。

請參閱How do I intercept a method call in C#?

3

類Y可以知道類X反映它的唯一方法是,如果類X以某種方式讓Y類知道通過調用方法或設置或獲取屬性的值。所以直接的答案是No.

+1

正確,在相同的概念中,人們可以創建一個故意不用的屬性,然後標記一個私有變量是屬性獲取器或設置器被調用。這樣做的問題在於,一般情況下的反射而沒有獲取和設置值將仍然對標誌沒有影響,因此不留下任何痕跡。 – Jay 2013-03-11 14:46:24

+0

這是對的傑伊。 – alejosoft 2013-03-11 14:53:51

相關問題