如何从作为参数传递给 Roslyn 的另一个方法的方法中获取 return 类型?
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){
....
}
}
我想从 someClass.Do(_factory.CreateSomeObject());
的 InvocationExpressionSyntax
中得到 return 类型的 CreateSomeObject
可能吗?
我有一个参数列表 (ArgumentSyntax),但我不知道如何从 ArgumentSyntax 获取方法 return 类型。
除了扫描 Factory
class 的解决方案并分析 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
来完成任务。
假设我有一个代码:
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){
....
}
}
我想从 someClass.Do(_factory.CreateSomeObject());
的 InvocationExpressionSyntax
中得到 return 类型的 CreateSomeObject
可能吗?
我有一个参数列表 (ArgumentSyntax),但我不知道如何从 ArgumentSyntax 获取方法 return 类型。
除了扫描 Factory
class 的解决方案并分析 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
来完成任务。