gpt4 book ai didi

c# - Roslyn 从 IMethodSymbol 获取 MethodInfo

转载 作者:太空狗 更新时间:2023-10-29 19:46:52 29 4
gpt4 key购买 nike

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

例如

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

其中 IMethodSymbol 标识“等于”

请注意,[Int32] 类型有 2 个 [Equals] 方法,一个接受 [Object],另一个接受 [Int32] 参数。

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

有什么想法吗?斯蒂沃

最佳答案

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

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

但是,对于像 System 这样的程序集,您可以从分析器代码访问它可能是一个相当安全的选择。

因此,您需要做的就是获取具有该方法的类型的命名空间和类型名称,并为其获取一个 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 来分析一些脚本那么您可能不必有该限制。

关于c# - Roslyn 从 IMethodSymbol 获取 MethodInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30528555/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com