如何从作为参数传递给 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){
....
}
}

我想从InvocationExpressionSyntaxsomeClass.Do(_factory.CreateSomeObject());获得返回类型的CreateSomeObject可能吗?

我有一个参数列表(ArgumentSyntax(,但我不知道如何从ArgumentSyntax获取方法返回类型。 除了扫描Factory类的解决方案并分析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

最新更新