我正在使用反射從類中讀取所有屬性和方法。所以我想用反射識別一個方法的內部調用方法。我嘗試使用'GetMethodBody()'方法讀取MethodBody。但它僅列出局部變量。那麼你能幫忙嗎?使用反射從'MethodInfo'類中讀取方法的內部調用方法名稱
回答
您不能通過反射從MethodInfo
獲得方法調用。
方法調用只是一個IL
指令,從反射的角度來看全是隻是IL
。加載參數的指令和調用方法的指令沒有區別。
但是,你仍然可以在某些方面做到這一點。
- 您可以使用
Roslyn
來檢查您的方法並搜索調用節點。 - 你可以從
MethodBody
的IL
,分析它,並搜索call
或callvirt
指令,那麼你需要解決的操作數(token
在我們的例子),並獲得方法。這不是一種簡單的方法,但您可以使用一些ILReader庫來處理它。
更新:
隨着羅斯林,你必須做一個以上的方式。
您可以將您的方法作爲MethodDeleration
並致電DescendantNodes().OfType<InvocationExpressionSyntax>()
。
您可以創建自定義CSharpSyntaxWalker
並覆蓋VisitInvocationExpression
並且您也可以使用CSharpSyntaxRewriter
。
爲了您的需要,您不需要重寫某些內容,因此您需要在DescendantNodes
(簡單的方式)和CSharpSyntaxWalker
(更優雅和更強大的方式)之間進行選擇。
你在這裏有很多例子,在StackOverflow和遍佈全球的網站。看看關於Roslyn的Josh Varty系列。此外,Github頁面是一個很好的資源。兩個必須使用的工具是Quoter和TryRoslyn。同時檢查VS的SyntaxVisulaizer。
IL解析方式更復雜(但不是太多)。 當我寫程序來做到這一點,調用GetILAsByteArray()
然後你需要解析字節找到調用指令,然後採取指令操作數和解析是令牌。
對於這一切,你可以使用一些現有的IL讀者喜歡this或this,當你figureout要求的說明,您需要調用yourModule.ResolveMethod
返回你的方法的基礎。檢查here和here爲例
你能提供關於此的任何鏈接或示例嗎? –
@AjoGeorge檢查更新 –
- 1. c#使用反射從底層類型獲取方法名稱
- 2. 無法獲取父類調用子類方法 - 使用反射
- 3. 反射 - 在指定的類名稱上動態調用方法
- 4. 使用反射類方法
- 5. 如何使用反射按名稱調用方法
- 6. 使用Java反射類獲取方法
- 7. 使用反射獲取類方法
- 8. 使用反射的調用方法
- 9. 使用反射的Java調用方法
- 10. 如何使用反射來重構按名稱獲取方法?
- 11. 如何查找使用強類型反射的泛型類方法的MethodInfo?
- 12. 從內部調用方法?
- 13. 如何使用反射調用方法
- 14. 使用反射調用方法
- 15. 使用反射調用靜態方法
- 16. Android/Java:使用反射調用方法?
- 17. 使用反射從基類調用方法
- 18. 使用反射來獲取具有相同名稱的不同類的方法?
- 19. 從方法引用獲取methodinfo C#
- 20. 使用反射從超類中的子類中找到方法
- 21. Python:使用反射來從類名稱中調用類成員
- 22. Java:在匿名內部類中調用外部類方法
- 23. scala中的反射。調用方法?
- 24. 如何在scala中使用反射調用對象方法(不是類方法)
- 25. 獲取調用方法的名稱javascript
- 26. 調用方法時的類名稱的使用方式與方法
- 27. 使用反射調用通用類的靜態方法
- 28. 試圖在同一類中使用反射來調用方法
- 29. .NET Compact Framework反射調用.NET框架類中的內部方法
- 30. 如何調用從匿名方法創建的MethodInfo?
「內部調用方法」?請舉一個你想要完成的事情的例子。 –