这是不可能可靠得到一个IMethodSymbol一个MethodInfo的,因为你需要有装配加载包含该方法的类型,这可能是正被解析脚本的情况,但可能不是就是正在执行分析的代码。
换句话说,您正在运行的脚本代码可能已经加载了包含类型T的程序集X,该程序包含方法M(因此脚本代码可以具有调用方法M的代码),但分析程序可能不是有装配X装,所以它可以不负载类型T,所以它可以不得到一个MethodInfo的实例方法M.
然而,对于像系统的组件,它可能是一个相当安全的赌注,你可以从分析器代码访问它。
因此,所有你需要做的就是具有方法类型的命名空间和类型名,并获得所属类别的实例吧。然后使用GetMethod - 将方法和参数类型的名称传递给MethodInfo。事情是这样的:
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()
);
值得一提的是分析仪是没有获得充分反射API经常便携式类库(也就是说,上面的代码将无法正常工作),但如果你只是使用Roslyn在一个项目中分析一些脚本,那么你可能不必有这个限制。