如何从作为参数传递给 Roslyn 的另一个方法的方法中获取 return 类型?

How can I obtain return type from method passed as an argument in another method with Roslyn?

假设我有一个代码:

public class Test {
    private readonly IFactory _factory;
    private readonly ISomeClass _someClass;

    public Test(IFactory factory, ISomeClass someClass)
    {
        _factory = factory;
        _someClass = someClass;
    }

    ....

    public void TestMethod() {
        _someClass.Do(_factory.CreateSomeObject());
    }
}

public class Factory {
    public SomeObject CreateSomeObject() {
        return new SomeObject();
    }
}

public class SomeClass {
    public void Do(SomeObject obj){
        ....
    }
}

我想从 someClass.Do(_factory.CreateSomeObject());InvocationExpressionSyntax 中得到 return 类型的 CreateSomeObject 可能吗?

我有一个参数列表 (ArgumentSyntax),但我不知道如何从 ArgumentSyntax 获取方法 return 类型。 除了扫描 Factory class 的解决方案并分析 CreateSomeObject 方法之外,还有更好更简单的方法吗?

是的,这是可能的。 您需要为此使用 Microsoft.CodeAnalysis.SemanticModel

我假设你已经有 CSharpCompilation 和 SyntaxTree 可用,所以你会用这样的东西来处理你的情况:

SemanticModel model = compilation.GetSemanticModel(tree);           
var methodSyntax = tree.GetRoot().DescendantNodes()
    .OfType<MethodDeclarationSyntax>()
    .FirstOrDefault(x => x.Identifier.Text == "TestMethod");
var memberAccessSyntax = methodSyntax.DescendantNodes()
    .OfType<MemberAccessExpressionSyntax>()
    .FirstOrDefault(x => x.Name.Identifier.Text == "CreateSomeObject");
var accessSymbol = model.GetSymbolInfo(memberAccessSyntax);
IMethodSymbol methodSymbol = (Microsoft.CodeAnalysis.IMethodSymbol)accessSymbol.Symbol;
ITypeSymbol returnType = methodSymbol.ReturnType;

一旦您从语义模型中获得所需的 SyntaxNode,您需要获得它的 SymbolInfo 并正确地转换它,以获得它的 ReturnType 来完成任务。