Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Roslyn从IMethodSymbol获取MethodInfo_C#_.net_Reflection_Roslyn_Methodinfo - Fatal编程技术网

C# Roslyn从IMethodSymbol获取MethodInfo

C# Roslyn从IMethodSymbol获取MethodInfo,c#,.net,reflection,roslyn,methodinfo,C#,.net,Reflection,Roslyn,Methodinfo,如何从IMethodSymbol(Roslyn语法树)可靠地获取MethodInfo(反射)。我可以从IMethodSymbol获取类型,该类型有许多方法,其中一个方法与IMethodSymbol实例匹配 e、 g 其中,IMethodSymbol标识“等于” 注意,[Int32]类型上有两个[Equals]方法,一个取[Object],另一个取[Int32]参数 我正在分析脚本,我没有任何工作区实例 有什么想法吗? Stevo无法从IMethodSymbol可靠地获取MethodInfo,因为

如何从IMethodSymbol(Roslyn语法树)可靠地获取MethodInfo(反射)。我可以从IMethodSymbol获取类型,该类型有许多方法,其中一个方法与IMethodSymbol实例匹配

e、 g

其中,IMethodSymbol标识“等于”

注意,[Int32]类型上有两个[Equals]方法,一个取[Object],另一个取[Int32]参数

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

有什么想法吗? Stevo

无法从IMethodSymbol可靠地获取MethodInfo,因为需要加载包含方法所属类型的程序集,这可能是正在解析的脚本的情况,但可能不是正在执行分析的代码的情况

换句话说,您正在运行的脚本代码可能已加载程序集X,其中包含类型T,该类型T上有方法M(因此脚本代码可以包含调用方法M的代码),但分析器可能未加载程序集X,因此无法加载类型T,因此无法获取方法M的MethodInfo实例

但是,对于类似于程序集的系统,您可以从Analyzer代码访问它,这可能是一个相当安全的赌注

因此,您所需要做的就是获取包含该方法的类型的名称空间和类型名,并获取该方法的TypeInfo实例。然后使用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来分析一些脚本,那么您可能不必有这种限制

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()
);