2017-11-03 1 views
2

응용 프로그램의 각 클래스 메서드 내에서 메서드 호출과 호출을 식별 할 수 있습니다. 그러나 어떻게 호출되거나 호출되는 클래스를 얻을 수 있습니까? 예를 들어 다음 코드에서 Roslyn에서 메서드 호출의 기본 클래스 얻기

:

var methodDeclarations = classitem.DescendantNodes().OfType<MethodDeclarationSyntax>(); 
foreach (var memmeth in methodDeclarations) 
{ 

    var varInvocations = memmeth.DescendantNodes().OfType<InvocationExpressionSyntax>(); 
    foreach (InvocationExpressionSyntax invoc in varInvocations) 
    { 
     Console.WriteLine("---- Invocations---"); 
     Console.WriteLine(invoc.Expression); // output: b1.ADD 
     Console.WriteLine(invoc.Expression.Parent.GetText()); // output: b1.ADD(2) 
    } 
} 

내가 할 수있는, 예를 들어, 출력으로 "b1.ADD"얻을 "b1.ADD을 (2)". 이걸 추출해야하는 것은 ADD가 B 클래스의 인스턴스 인 b1에 호출된다는 것입니다. 위의 코드에서이 B 클래스를 호출 할 때 어떻게 얻을 수 있습니까? 즉,이 메소드가 속한 클래스 유형을 알려줘야합니다. 어떻게해야합니까?

+0

'InvocationExpressionSyntax'는'MemberBindingExpressionSyntax'을 포함하고'MemberBindingExpressionSyntax'는 어떤 진단 ('membind.GetDiagnostics()')을 포함합니까? – grek40

답변

0

감사합니다. 그 일을하는 해결책은 다음과 같습니다.

var model = compilation.GetSemanticModel(tree); 
var methodDeclarations = classitem.DescendantNodes().OfType<MethodDeclarationSyntax>(); 
foreach (var memmeth in methodDeclarations) 
{ 

    var varInvocations = memmeth.DescendantNodes().OfType<InvocationExpressionSyntax>(); 
    foreach (InvocationExpressionSyntax invoc in varInvocations) 
    { 
     Console.WriteLine("---- Invocations---"); 
     Console.WriteLine(invoc.Expression); // output: b1.ADD 
     Console.WriteLine(invoc.Expression.Parent.GetText()); // output: b1.ADD(2) 
     var invokedSymbol = model.GetSymbolInfo(invoc).Symbol; 
     Console.WriteLine(invokedSymbol.ToString()); //AppTest.B.ADD(int) 
     Console.WriteLine(invokedSymbol.ContainingSymbol); //AppTest.B 
     Console.WriteLine(invokedSymbol.ContainingSymbol.Name); //B 
    } 
} 

마지막 줄은 (문자열로) 호출 된 메소드의 클래스 이름을 가져옵니다 밖으로 인쇄를 : 그것은 최고의 솔루션과 우아한 하나의 경우 비록 확실하지.

1

시맨틱 모델이 필요합니다.이 모델을 사용하면 컴파일러에서 형식 정보에 액세스 할 수 있습니다 (구문 트리는 파일의 구문 만 확인).

특히 InvocationExpressionSyntaxGetSymbol()을 보내고 IMethodSymbol으로 전송하고 다양한 속성을 확인해야합니다.

+2

'InvocationExpressionSyntax'의'GetSymbol'은'ContainingType'을 포함하여 메소드에 대한 정보를 제공 할 것입니다 만,'b1'의 실제 타입을 알려주지는 않습니다. 그것을 얻기 위해서는'b1' 자체에'GetTypeInfo'를 호출해야합니다. –

관련 문제