如何从使用Roslyn的另一个方法中作为参数传递的方法中获取返回类型?

时间:2019-12-19 10:40:08

标签: c# .net roslyn roslyn-code-analysis

让我们说我有一个代码:

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){
        ....
    }
}

我想从CreateSomeObject的{​​{1}}获取InvocationExpressionSyntax的返回类型吗?

我有一个参数列表(ArgumentSyntax),但是我不知道如何从ArgumentSyntax获取方法返回类型。 除了扫描someClass.Do(_factory.CreateSomeObject());类的解决方案并分析Factory方法之外,还有其他更好且更轻松的方法吗?

1 个答案:

答案 0 :(得分:0)

是的,有可能。 您将需要使用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