2016-11-16 35 views

回答

1

您不能通過反射從MethodInfo獲得方法調用。

方法調用只是一個IL指令,從反射的角度來看全是隻是IL。加載參數的指令和調用方法的指令沒有區別。

但是,你仍然可以在某些方面做到這一點。

  1. 您可以使用Roslyn來檢查您的方法並搜索調用節點。
  2. 你可以從MethodBodyIL,分析它,並搜索callcallvirt指令,那麼你需要解決的操作數(token在我們的例子),並獲得方法。這不是一種簡單的方法,但您可以使用一些ILReader庫來處理它。

更新:

隨着羅斯林,你必須做一個以上的方式。

您可以將您的方法作爲MethodDeleration並致電DescendantNodes().OfType<InvocationExpressionSyntax>()

您可以創建自定義CSharpSyntaxWalker並覆蓋VisitInvocationExpression並且您也可以使用CSharpSyntaxRewriter

爲了您的需要,您不需要重寫某些內容,因此您需要在DescendantNodes(簡單的方式)和CSharpSyntaxWalker(更優雅和更強大的方式)之間進行選擇。

你在這裏有很多例子,在StackOverflow和遍佈全球的網站。看看關於Roslyn的Josh Varty系列。此外,Github頁面是一個很好的資源。兩個必須使用的工具是QuoterTryRoslyn。同時檢查VS的SyntaxVisulaizer

IL解析方式更復雜(但不是太多)。 當我寫程序來做到這一點,調用GetILAsByteArray()然後你需要解析字節找到調用指令,然後採取指令操作數和解析是令牌。

對於這一切,你可以使用一些現有的IL讀者喜歡thisthis,當你figureout要求的說明,您需要調用yourModule.ResolveMethod返回你的方法的基礎。檢查herehere爲例

+0

你能提供關於此的任何鏈接或示例嗎? –

+0

@AjoGeorge檢查更新 –