gpt4 book ai didi

c# - 在 Roslyn 中获取 SymbolCallerInfo 的通用参数

转载 作者:行者123 更新时间:2023-11-30 15:32:15 26 4
gpt4 key购买 nike

我试图在调用方法 IBus.Publish<T> 的解决方案中找到所有位置(来自 NServiceBus)。到目前为止这是有效的:

IMethodSymbol method = ... [IBus.Publish methodsymbol resolved];
var callers = method.FindCallers(solution, new CancellationToken());

这导致 IEnumerable<SymbolCallerInfo>并且我得到了对该方法的所有正确引用。

现在我将如何获得通用参数 IBus.Publish被称为?我是否必须手动解析 sourcetree,或者它是否存在一些我可以利用的 Roslyn 魔法?

例子:

在我的代码中我有:

IBus _bus;

_bus.Publish<IMyMessage>(msg => { msg.Text = "Hello world"});

我有兴趣获得 IMyMessage类型。

非常感谢您的帮助!

最佳答案

您可以使用 SemanticModelSyntaxNode 调用实际的 MethodSymbol,然后您可以只读取 TypeArguments 属性获取参数的 TypeSymbol。如果未明确指定参数,这甚至会起作用,因为 SemanticModel 将执行类型推断。

例如:

var callers = method.FindCallers(solution, CancellationToken.None);
foreach (var caller in callers)
{
foreach (var location in caller.Locations)
{
if (location.IsInSource)
{
var callerSemanticModel = solution
.GetDocument(location.SourceTree)
.GetSemanticModel();
var node = location.SourceTree.GetRoot()
.FindToken(location.SourceSpan.Start)
.Parent;
var symbolInfo = callerSemanticModel.GetSymbolInfo(node);
var calledMethod = symbolInfo.Symbol as IMethodSymbol;
if (calledMethod != null)
{
var arguments = calledMethod.TypeArguments;
}
}
}
}

关于c# - 在 Roslyn 中获取 SymbolCallerInfo 的通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19397305/

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