Non è possibile affidabile ottenere un MethodInfo da un IMethodSymbol perché è necessario avere l'assembly caricato che contiene il tipo che il metodo è in, che potrebbe essere il caso per lo script che viene analizzato, ma potrebbe non essere il caso per il codice che sta eseguendo l'analisi. In altre parole, il codice di script in esecuzione potrebbe avere l'assembly X caricato che contiene il tipo T che ha il metodo M su di esso (e quindi il codice dello script può avere codice che chiama il metodo M) ma l'analizzatore potrebbe non hanno assemblaggio X caricato e in modo che possa non carico tipo T e quindi può non ottenere un'istanza di MethodInfo per il metodo M.
Tuttavia, per un'assemblea, come sistema, probabilmente è una scommessa abbastanza sicura che si può accedervi dal codice dell'analizzatore.
Quindi, tutto quello che avresti bisogno di fare è ottenere lo spazio dei nomi e digitare il nome del tipo che ha il metodo e ottenere un'istanza TypeInfo per esso. Quindi usa GetMethod - passandogli il nome del metodo e dei tipi di argomento per ottenere un MethodInfo. Qualcosa di simile a questo:
var invocation = (InvocationExpressionSyntax)context.Node;
var methodSymbol = (IMethodSymbol)context.SemanticModel.GetSymbolInfo(invocation).Symbol;
var declaringTypeName = string.Format(
"{0}.{1}",
methodSymbol.ContainingType.ContainingAssembly.Name,
methodSymbol.ContainingType.Name
);
var methodName = methodSymbol.Name;
var methodArgumentTypeNames = methodSymbol.Parameters.Select(
p => p.Type.ContainingNamespace.Name + "." + p.Type.Name
);
var methodInfo = Type.GetType(declaringTypeName).GetMethod(
methodName,
methodArgumentTypeNames.Select(typeName => Type.GetType(typeName)).ToArray()
);
Vale la pena notare che gli analizzatori sono librerie di classi spesso portatili che non hanno accesso alle API completa di riflessione (il che significa che il codice di cui sopra non funziona), ma se si sta usando solo Roslyn in un progetto per analizzare alcuni script quindi probabilmente non devi avere questa limitazione.
fonte
2016-06-25 17:11:28