2015-05-29 63 views
8

得到的MethodInfo我怎么能可靠地得到IMethodSymbol MethodInfo的(反射)(罗斯林语法树)。我可以从IMethodSymbol中获取Type,并且该类型有许多方法,其中一个与IMethodSymbol实例匹配。罗斯林从IMethodSymbol

例如

int i = 0; 
i.Equals(5); 

其中IMethodSymbol标识 '等于'

注意,有2 [等于]上的[的Int32]方法键入,一个取和本发明的课题,另外取[的Int32]参数。

我正在解析脚本,我没有任何工作区实例。

任何想法? 斯特沃

回答

1

这是不可能可靠得到一个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在一个项目中分析一些脚本,那么你可能不必有这个限制。