假设我有一个代码:
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){
....
}
}
我想从InvocationExpressionSyntax
someClass.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