如何在方法调用时找到方法参数的类型?

问题描述 投票:0回答:1

假设我们有以下基础模型。

public class Base
{
   ...
}

并且有 M1, ..., Mn 由这个模型衍生出来的模型。

我们有一个结构如下的接口。

public interface IExampleInterface
{
    void DoSomething(Base input);
}

假设我们为这个类做了一个简单的实现, 比如像这样:

public class Example : IExampleInterface
{
   void DoSomething(Base input) 
   {
       System.Console.WriteLine("Please help me!!");
   }
}

有很多调用 IExampleInterface.DoSomething是什么? 方法的不同输入参数的解决方案。

var ex = new Example();
var m = new M();
ex.DoSometing(m);

其中M可以是任何类型,从 M1, ..., Mn.

我成功地从语法树中找到了接口,它的实现和参数类型,甚至我还找到了调用者,但我难以在 IExampleInterface.DoSomething是什么? 调用。

这是代码。

var interfaceName = "IExampleInterface";
var returnType = "Void";
var methodName = "DoSomething";
var arg = "Base";

var exInterface = compilations
        .SelectMany(compilation => compilation.SyntaxTrees.Select(syntaxTree => compilation.GetSemanticModel(syntaxTree)))
        .SelectMany(
            semanticModel => semanticModel
                .SyntaxTree
                .GetRoot()
                .DescendantNodes()
                .OfType<InterfaceDeclarationSyntax>()
                .Select(interfaceDeclarationSyntax => semanticModel.GetDeclaredSymbol(interfaceDeclarationSyntax)))
        .Where(s => s.Name == interfaceName)
        .FirstOrDefault();

var implementations = await SymbolFinder.FindImplementationsAsync(exInterface, solution);
var implementation = implementations.FirstOrDefault() as ITypeSymbol;
var method = exInterface
        .GetMembers(methodName)
        .Where(m => m.Kind == SymbolKind.Method)
        .Cast<IMethodSymbol>()
        .FirstOrDefault(m =>
            m.Parameters != null &&
            m.Parameters.Length == 1 &&
            m.Parameters[0].Type.Name == arg &&
            m.ReturnType.Name == returnType);

var callers = await SymbolFinder.FindCallersAsync(method, solution);

在这一点上我被卡住了 我对 Roslyn. 我的问题是如何找到传递给 IExampleInterface.DoSomething是什么? 调用?

c# metaprogramming roslyn static-analysis analyzer
1个回答
0
投票

其实我解决这个问题的方法是得到 语义模型 的编制。

首先,在找到所有的调用者后,我们需要找到 InvocationExpression 节点的帮助下 呼叫符号SymbolCallerInfo.

其次,我们必须从我们感兴趣的论点中得到 ArgumentList 的财产 InvocationExpression.

假设 争论 是所需的参数,而 汇编 是编译实例,其中 争论 是从。

var type = compilation
      .GetSemanticModel(arg.SyntaxTree)
      .GetTypeInfo(arg.ChildNodes().First());
© www.soinside.com 2019 - 2024. All rights reserved.