簡體   English   中英

如何從 Roslyn 的另一個方法中作為參數傳遞的方法獲取返回類型?

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

我想獲得的返回類型CreateSomeObjectInvocationExpressionSyntaxsomeClass.Do(_factory.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這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM