簡體   English   中英

用反射改變方法訪問修飾符

[英]Changing method access modifier with reflection

我有一個場景,我使用城堡動態代理來攔截和記錄任何給定類的消息調用(讓我們稱之為目標類)。 我這樣做是通過將target-class包裝在一個類中,該類使用攔截器創建類的代理,該攔截器記錄對目標類的所有方法調用。 這很好用。 唯一的問題是,為了使其工作,目標類上的所有公共方法都需要是虛擬的,出於更多原因是不可取的。

我可以創建一個解決方案,我在創建代理時驗證所有方法都是虛擬的,如果不是這樣,則拋出異常,但我寧願是否可以使用反射將方法更改為虛擬(或其他方法) )在生成代理之前。 通過這種方式,我可以使用所有類,而無需關注它是否具有虛擬方法。

我在這里缺少什么,我可以以某種方式存檔嗎?

您無法通過使用反射來更改方法是否為虛擬方法。 實際上,你不能用反射改變任何東西,它是你的類型結構的只讀接口(應該是這樣)。

您最好的選擇是為類創建一個接口,更新對它的引用以使用該接口並在接口上構建代理。 然后你的類不必有虛擬方法,但你的代理將實現接口,攔截器將工作。

你可以用Mono Cecil做到這一點。

如果您不控制用於生成程序集的代碼,則此方法實際上是唯一的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM