[英]C# Generics How Can I get the type passed as an argument for a generic method with no object type as a parameter?
[英]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){
....
}
}
我想獲得的返回類型CreateSomeObject
從InvocationExpressionSyntax
的someClass.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.