让我们说我有一个代码:
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
方法之外,还有其他更好且更轻松的方法吗?
答案 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
。