Roslyn ruft MethodInfo von IMethodSymbol ab

8

Wie kann ich MethodInfo (Reflection) zuverlässig von IMethodSymbol (Roslyn Syntaxbaum) erhalten. Ich kann den Typ aus dem IMethodSymbol abrufen, und der Typ verfügt über viele Methoden, von denen eine der IMethodSymbol-Instanz entspricht.

z.B.

%Vor%

wobei das IMethodSymbol "Gleich" angibt

Beachten Sie, dass es zwei [Equals] -Methoden für einen [Int32] -Typ gibt, eine für die Aufnahme und [Object], die andere für den [Int32] -Parameter.

Ich analysiere Skripte, ich habe keine Arbeitsbereichsinstanzen.

Irgendwelche Ideen? Stevo

    
user1275154 29.05.2015, 11:33
quelle

1 Antwort

1

Es ist nicht möglich zuverlässig eine MethodInfo von einem IMethodSymbol abzurufen, da die Assembly geladen werden muss, die den Typ enthält, auf dem die Methode ausgeführt wird, was für das aktuelle Skript der Fall sein kann geparst, aber nicht ist möglicherweise der Fall für den Code, der die Analyse durchführt.

Mit anderen Worten: Im gerade ausgeführten Skriptcode ist Assembly X geladen, das den Typ T mit der Methode M enthält (und der Skriptcode kann also Code haben, der die Methode M aufruft), der Analysator jedoch nicht hat die Assembly X geladen und kann daher nicht den Typ T laden, und so kann nicht eine MethodInfo-Instanz für Methode M erhalten.

Bei einer Assembly wie System ist es jedoch wahrscheinlich ziemlich sicher, dass Sie über den Analyzer-Code darauf zugreifen können

Sie müssen also nur den Namespace und den Typ des Typs mit der Methode abrufen und eine TypeInfo-Instanz dafür abrufen. Verwenden Sie dann GetMethod - übergeben Sie den Namen der Methode und der Argumenttypen, um eine MethodInfo zu erhalten. Etwas wie das:

%Vor%

Es ist erwähnenswert, dass Analysatoren oft portable Klassenbibliotheken sind, die keinen Zugriff auf die vollständige Reflektions-API haben (was bedeutet, dass der obige Code nicht funktioniert), aber wenn Sie Roslyn nur in einem Projekt verwenden, um einige Skripte zu analysieren dann müssen Sie diese Einschränkung wahrscheinlich nicht haben.

    
Dan Roberts 25.06.2016 17:11
quelle